文章目录
一、PHP7在zend虚拟机执行过程
读入脚本程序字符串,经由词法分析器将其转换为单词符号,接着语法分析器从中发现语法结构后生成抽象语法树,再经静态编译器生成opcode,最后经解释器模拟机器指令来执行每一条opcode。
二、php sapi
SAPI 即 Server API ,是应用程序与外部程序的通讯协议。PHP脚本要执行有很多方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。
SAPI提供了一个和外部通信的接口,常见的SAPI有:cgi、fast-cgi、cli、apache模块的DLL、isapi
2.1 cgi
cgi是处理web服务器的动态请求的一种方式,通过fork一个进程来处理一个请求。但是效率是很低下的,频繁的创建和销毁线程。所以通过一个中间层 fastcgi 来进行对cgi程序的管理。
这种方式的话就是通过 fastcgi 来对于cgi进程管理,使得一个cgi程序就能主管一个功能模块。
2.2 FastCGI
PHP使用PHP-FPM(FastCGIProcessManager),全称PHPFastCGI进程管理器进行管理。
FastCGI的工作原理:
- Web Server启动时载入FastCGI进程管理器
- FastCGI进程管理器自身初始化,启动多个CGI解释器(可见多个php-cgi)并等待来自Web Server的连接
- 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web Server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
- FastCGI子进程php-cgi完成处理后,将标准输出和错误信息从同一连接返回Web Server。
- 当FastCGI子进程关闭连接时,请求便告知处理完成。FastCGI子进程接着等待并处理来自FastCGI继承管理器的下一个连接。
- 在CGI模式中,php-cgi在此便退出了。
2.3 ISAPI
ISAPI(Internet Server Application Program Interface)是微软提供的一套面向 WEB 服务的 API 介面,它能实现 CGI 提供的全部功能
三、PHP IteratorAggregate
3.1 迭代器(iterable)
iterable是一个超级接口,可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
3.2 实现
在下面的PHP脚本,一个类,它实现IteratorAggregate接口所有包含数组作为property,getIterator()方法返回ArrayIterator对象出这个数组。我们可以使用foreach循环遍历数组。
<?Php
class myIterator implements IteratorAggregate {
public $arr;
public function __construct() {
$this->arr = array(10,20,30,40);
}
public function getIterator() {
return new ArrayIterator($this->arr);
}
}
$obj = new myIterator();foreach($obj as $key => $value) {
echo $key ." =>" . $value . "\n";
}?>
四、php的垃圾回收
4.1 GC(Garbage Collection)垃圾回收机制
GC可以找到内存中的垃圾、并释放和回收空间
4.2 php垃圾回收核心思想
在 PHP5.3 之前,PHP 的垃圾回收机制非常简单,就是把 refcount 为0的全部清理回收掉,在底层也就是 free 掉了
- 设置引用数,判断当前引用数是否为0
- 引用计数器
- 引用关系改变时修改引用数字
- 引用数字为0时立即回收
- PHP5.3 后并不是直接看每个变量的 refcount 是否为0了
- 使用的算法是深度遍历,有个根缓冲区,根据它来清理,具体算法需要比较扎实的 C 和算法基础
- 5.3 之后和算法解决了循环引用的问题
- 内存泄露值会保持在某一个范围,不会出现立即大范围崩溃的情况
五、flock
php多进程读写一个文件,用flock() 函数锁定或释放文件。
$file = fopen("test.txt","w+"); // 打开文件
// 排它性的锁定 先锁上,写完,解锁。
if (flock($file,LOCK_EX)){
fwrite($file,"Write something");
flock($file,LOCK_UN); // 文件解锁
}else{
echo "Error locking file!";
}
fclose($file); // 关闭文件
六、set_error_handler
函数设置用户自定义的错误处理函数。