1.正则表达式
正则表达式的作用:分割、查找、匹配字符串
分割符: 正斜线/
、hash符号#
、以及取反符号~
通用原子: \d
->\D
,\w
,\W
,\s
,\S
元字符: .
,?
,^
,$
,+
,{n}
,{n,}
,{n,}
,{n,m}
,[]
,()
,[^]
,|
,[-]
模式修正符:
i ->->-> 不区分大小写
m ->->-> 将字符串进行分割后,对每一行分别进行匹配(前提是字符串中有换行)
e ->->-> 对匹配的字符串做PHP语法处理
s ->->-> 修正点的换行
U ->->-> 取消贪婪模式
x ->->-> 忽略模式中的空白符
A ->->-> 必须以此模式开头
D ->->-> 修正$对\n的忽略
u ->->-> utf8中文匹配
后向引用
$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>/';
preg_replace($pattern,'\\1',$str);
贪婪模式
$str = '<b>abc</b><b>bcd</b>';
//此处的'.*'匹配的'abc</b><b>bcd'
$pattern = '/<b>.*<\/b>/';
//此处的'.*?'匹配的是'abc','bcd'
//'?'放在后面可取消贪婪
$pattern = '/<b>.*?<\/b>/';
//取消贪婪还可以用模式修正符
$pattern = '/<b>.*</b>/U';
preg_replace($pattern,'\\1',$str);
正则表达式中的PCRE函数
preg_match()
:执行匹配正则表达式
preg_match_all()
:执行一个全局正则表达式匹配
preg_replace()
:执行一个正则表达式的搜索和替换
preg_split()
:通过一个正则表达式分隔字符串
中文匹配
UTF-8汉字编码范围是0x4e00-0x9fa5
UTF-8要使用u
模式修正符使模式字符串被当成UTF-8
$pattern = '/[\x{4e00}-\x{9fa5}+/u';
ANSI(gb2321)环境下,0xb0-0xf7
,‘0xa1-0xfe’
要使用chr
将ASCII
码转换为字符
$pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chroxfe.']/';
实例
//请写出以139开头的11位手机号码的正则表达式
$str = '13988888888';
$pattern = '/^139\d{8}$/';
preg_match($pattern, $str, $match);
var_dump($match);
2.文件及目录处理
文件读取和写入操作
fopen()函数
用来打开一个文件,打开时需要指定打开模式
'r' ->->-> 只读方式打开,将文件指针指向文件头。
'r+' ->->-> 读写方式打开,将文件指针指向文件头。
'w' ->->-> 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+' ->->-> 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a' ->->-> 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'a+' ->->-> 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'x' ->->-> 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。
'x+' ->->-> 创建并以读写方式打开,其他的行为和 'x' 一样。
//要使用b/t标记,要么用 'b' 或者用 't' 作为 上述参数的最后一个字符。
'b' ->->-> 使用 'b' 来强制使用二进制模式,这样就不会转换数据。
't' ->->-> Windows 下提供了一个文本转换标记('t')可以透明地将 \n 转换为 \r\n。
写入函数
fwrite
:写入文件(可安全用于二进制文件)
fputs
: fwrite() 的别名
读取函数
fread
:读取文件(可安全用于二进制文件)
fgets
: 从文件指针中读取一行
fgetc
: 从文件指针中读取字符
关闭文件函数
fclose
:关闭一个已打开的文件指针
不需要fopen()打开的函数
file_get_contents
: 将整个文件读入一个字符串
file_put_contents
: 将一个字符串写入文件
其他读取函数
file()
:把整个文件读入一个数组中
readfile()
:输出文件(读取文件并写入到输出缓冲。)
访问远程文件
开启allow_url_fopen
,HTTP协议连接只能使用只读,FTP协议可使用只读或者只写
目录操作函数
//名称相关
basename() ->->-> 返回路径中的文件名部分
dirname() ->->-> 返回路径中的目录部分
pathinfo() ->->-> 返回文件路径的信息
//目录读取
opendir() ->->-> 打开目录句柄
readdir() ->->-> 从目录句柄中读取条目
closedir() ->->-> 关闭目录句柄
rewinddir() ->->-> 倒回目录句柄
//目录删除
rmdir() ->->-> 删除目录
//目录创建
mkdir() ->->-> 新建目录
其他函数
filesize() ->->->取得文件大小
//目录大小
disk_free_space() ->->->返回目录中的可用空间
disk_total_space() ->->->返回一个目录的磁盘总大小
copy() ->->->文件拷贝
unlink() ->->->删除文件
filetype() ->->->取得文件类型
rename() ->->->重命名一个文件或目录
ftruncate() ->->->将文件截断到给定的长度
//文件属性
file_exists() ->->->检查文件或目录是否存在
is_readable() ->->->判断给定文件名是否可读
is_writable() ->->->判断给定的文件名是否可写
is_executable() ->->-> 判断给定文件名是否可执行
filectime() ->->->取得文件的 inode 修改时间
fileatime() ->->->取得文件的上次访问时间
filemtime() ->->->取得文件修改时间
//文件锁
flock() ->->->轻便的咨询文件锁定
//文件指针
ftell() ->->->返回文件指针读/写的位置
fseek() ->->->在文件指针中定位
rewind() ->->->倒回文件指针的位置
实例:
//遍历一个目录
<?php
$dir = '../basicPHP';
function loopDir($dir){
$handle = opendir($dir);
while(false!==($file = readdir($handle)))
{
if ($file != '.'&& $file != '..') {
echo $file.'<br/>';
if (filetype($dir.'/'.$file) == 'dir') {
loopDir($dir.'/'.$file);
}
}
}
}
loopDir($dir);
3.会话控制技术
为什么要使用会话控制技术?
因为HTTP是无状态协议,会话控制技术可以保持用户的状态…
Cookie
//写入
setcookie($name,$value,$expire,$path,$domain,$secure);
//读取
$_COOKIE
//删除,值为空,时间过期
set($name,'',time()-1000)
Cookie的优缺点:
将信息存储在客户端,不会占用服务器资源,无法保存敏感信息,且用户可禁用Cookie的使用
Session
将用户的信息存储在服务器中的,用户是无法禁用Session的使用的,Session是基于Cookie的,SessionID存储在Cookie中,如果Cookie被禁用,可以通过url来传递SessionID,从而保持用户状态
session_start()
$_SESSION
//清空session
$_SESSION = [];
//删除session及sessionID
session_destroy();
//配置文件
session.auto_start
session.cookie_domain
session.cookie_lifetime
session.cookie_path
session.name
session.save_path
session.use_cookies
//垃圾回收
session.gc_probability
session.gc_divisor
session.gc_maxlifetime
session.save_handler
Session的优缺点
优点就是安全,缺点就是占有服务器资源,以及分布式问题(使用Redis解决)。
传递SessionID的问题:
session_name()
和session_id()
<a href='1.php?'<?php echo session_name().'='.session_id();?>>新页面</a>
//SID等效于session_name().'='.session_id();
//如果开启Cookie,SID为空,否则如上
<a href='1.php?'<?php echo SID; ?>></a>
Session存储
session_set_save_handler()
建议将Session存储在内存服务器中
MySQL、Memcache、Redis等
4.PHP面向对象
public
:公有的类成员可以在任何地方被访问。
protected
:受保护的类成员则可以被其自身以及其子类和父类访问。
private
:私有的类成员则只能被其定义所在的类访问。
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
单一继承:PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承。(如果有接口,可以继承一个类,一个接口)
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
面向对象的多态
抽象类的定义:
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
魔术方法
__construct() ->->->PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
__destruct() ->->->析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
__call() ->->->在对象中调用一个不可访问方法时,__call() 会被调用。
__callStatic() ->->->在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
__get() ->->->读取不可访问属性的值时,__get() 会被调用。
__set() ->->->在给不可访问属性赋值时,__set() 会被调用。
__isset() ->->->当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
__unset() ->->->当对不可访问属性调用 unset() 时,__unset() 会被调用。
__sleep() ->->->__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
__wakeup() ->->->__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
__toString() ->->->__toString() 方法用于一个类被当成字符串时应怎样回应。
__clone() ->->->对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。
不能在
__toString()
方法中抛出异常。这么做会导致致命错误。
这些魔术方法的参数都不能通过引用传递。
方法名和类名保持一致,这个方法也是构造方法
自 PHP 5.3.3 起,在命名空间中,与类名同名的方法不再作为构造函数。这一改变不影响不在命名空间中的类。
设计模式
工厂模式、单例模式、注册树模式、适配器模式、观察者模式、策略模式
5.网络协议
HTTP协议状态码
->类别 ->原因短语
1XX ->Informational(信息性状态码) ->接收的请求正在处理
2XX ->Success(成功状态码) ->请求正常处理完毕
3XX ->Redirection(重定向状态码) ->需要进行附加操作以完成请求
4XX ->Client Error(客户端错误状态码) ->服务器无法处理请求
5XX ->Server Error(服务器错误状态码) ->服务器处理请求出错
常见状态码:
200 ->->表示从客户端发来的请求在服务器端被正常处理了
204 ->->(No Content)表示服务器接收的请求已成功处理,但返回响应报文中不含实体的主体部分。另外也不允许返回任何实体的主体
206 ->->(Partial Content)表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求
301 ->->永久重定向。表示请求的资源已被分配新的URI,以后事业资源现在所指的URI。
302 ->->临时重定向。表示请求的资源已被分配新的URI,希望用户本次能使用新的URI访问。
303 ->->由于请求对应的资源存在另一个URI,应当使用GET方法定向获取请求的资源。
304 ->->表示客户端发送附带条件的请求时,服务器端允许请求资源,但因发生请求未满足条件的情况后,直接返回304(Not Modified)
307 ->->临时重定向
400 ->->请去报文中存在语法错误
401 ->->表示发送的请求需要有HTTP认证的认证信息。
403 ->->表明对请求资源的访问被服务器拒绝了
404 ->->表明服务器上无法找到请去资源
500 ->->表明服务器端在执行请求时发送了错误
503 ->->表明服务器暂时处于超负载或者正在进行停机维护,现在无法处理请求
OSI七层模型
第一层:物理层
建立、维护、断开物理连接
第二层:数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验等功能
第三层:网络层
进行逻辑地址寻址,实现不同网络之间的路径选择
第四层:传输层(TCP UDP协议在该层)
定义传输数据的协议端口号,以及流控和差错校验
数据包一旦离开网卡即进入网路传输层
第五层:会话层
建立、管理、终止会话
第六层:表示层
数据的表示、安全、压缩
第七层:应用层
网路服务与最终用户的一个接口
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
HTTP协议的工作特点与工作原理
1.工作特点:
①基于B/S模式
②通信开销小、简单快速、传输成本低
③使用灵活、可使用超文本传输协议
④节省传输时间
⑥无状态
2.工作原理
客户端发送请求给服务器,创建一个TCP连接,指定端口号,默认80,连接到服务器,服务器监听浏览器请求,一旦监听到客户端请求,分析请求类型后,服务器会向客户端返回状态信息和数据内容。
HTTP协议常见请求/响应头
Content-Type ->->->实体主体内对象的媒体类型
Accept ->->->指定客户端能够处理的媒体类型及媒体类型的优先级
Origin ->->->初始请求地址,主要用于POST请求
Cookie ->->->HTTP请求发起时,就会在请求中包含Cookie信息
Cache-Control ->->->指定请求和响应的缓存机制
User-Agent ->->->客户端信息
Referer ->->->上级请求路径
X-Forwarded-For ->->->请求端的真实IP
Access-Control-Allow-Origin ->->->允许特点域名访问,常用于跨域使用
Last-Modified ->->->请求资源的最后修改日期时间
HTTP协议的请求方法
幂等:每次拿到的数据相同
GET ->->->获取资源,请求访问已被URI识别的资源,指定的资源经服务器解析后返回响应内容。
POST ->->->传输实体主体
HEAD ->->->获得报文首部,与GET一样,但不返回报文主体
OPTIONS ->->->询问支持方法
PUT ->->->传输文件,在报文主体中包含文件内容,保存在请求指定的URI中
DELETE ->->->删除文件,按照请求URI删除指定资源
TRACE ->->->追踪路径
HTTP协议的GET和POST请求方法的区别:
1.后退刷新时,GET不会变化,但POST会重新提交数据
2.GET可以被收藏为书签,但POST不能
3.GET请求可以被浏览器缓存,但POST不能
4.编码类型,POST可以为二进制数据使用 多重编码
5.GET的参数会保留在历史记录中,POST不会
6.浏览器对GET有数据长度限制(IE中:2083字节),POST没有限制
7.GET的数据类型只允许ASCII字符,但POST无限制
8.GET的安全性差,POST安全性比GET好
HTTPS的工作原理:
HTTPS是一种基于SSL/TLS的HTTP协议,所有的HTTP数据都在在SSL/TLS协议封装之上进行传输的。
HTTPS协议在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。
常见网路协议含义及端口
->->->名称 ->端口号
FTP ->->->文件传输协议 ->21
Telnet ->->->远程登录端口 ->23
SMTP ->->->简单邮件传输协议 ->25
POP3 ->->->接收邮件 ->110
HTTP ->->->超文本传输协议 ->80
DNS ->->->域名解析服务 ->53
TCP协议,提供可靠的字节流服务
三次握手:
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带有ACK标志的数据包,代表"握手结束"。
6.开发环境及配置
PHP运行原理
CGI协议:解决不同的语言解析器与web server
的通信,但是效率低;web server
没收到一个请求就会fork一个CGI进程,请求结束后会cue掉这个进程
FastCGI:每次处理完请求以后不会cue掉该进程,而会保留进程,使该进程可以一次性处理多个进程。
PHP-FPM:进程管理器,管理启动一个master进程和多个worker进程的程序。
PHP常见配置项
register_globals ->->注入变量(建议关闭)
allow_url_fopen ->->是否允许打开远程文件
allow_url_include ->->是否允许远程包含文件
date.timezone ->->设置时区
display_errors ->->是否显示错误
error_reporting ->->显示错误的级别设置
safe_mode ->->是否开启安全模式
upload_max_filesize ->->上传文件的最大大小
max_file_uploads ->->上传文件的最大数量
post_max_size ->->post数据的最大大小