php解析的过程,php是如何经过解析的

c27b06e237120d0dca4cf0502be61c88.png

要了解php的解析过程首先要了解cgi,fastcgi,php-fpm的相关概念。

cgi是什么?

cgi(通用网关接口)实际上是一种协议,实现cgi协议的程序我们可以称之为cgi程序,CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。而php-cgi就是用来解析PHP代码的一种协议。但是这种协议有几个弊端。

首先,每当客户端请求一个PHP脚本文件时,服务器就会fork一个进程调用解析器来对该脚本进行解析,当这个脚本执行完毕后该进程就会被kill掉,并且每次fork的进程都会过一遍php.ini来初始化环境。进程无法复用,并且增加了对php.ini的io开销。限制了PHP的执行速度。于是聪明的phper想出了更好的cgi协议,也就是后来出的fastcgi协议。

fastcgi协议

顾明思议,更快的cgi协议。那么他快在哪里呢?

首先fastcg解决了原有的php-cgi的毛病,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,web服务器性能上有了很大的提高。实际上Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。

当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。

php-fpm

PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器,对于PHP 5.3.3之前的php来说,是一个补丁包 ,旨在将FastCGI进程管理整合进PHP包中。

如果你使用的是PHP5.3.3之前的PHP的话,就必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。实际上我们可以把php-fpm看成 一个解释器。我们可以使用命令:ps -aux | grep php-fpm来查看对应的进程状态,如下图:

04fa253f64dbc3dc445ef882a3e2593c.png

使用php-fpm是可以平滑重启的,一般修改php.ini之后,php-cgi进程是没办法平滑重启的,也就是说你必须重启服务才能重新加载新的配置。而php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

PHP代码解析过程:

1、Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)。

2、Parsing, 将Tokens转换成简单而有意义的表达式。

3、Compilation, 将表达式编译成Opocdes。

4、Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值