0%

PHP知识点整理(四)-PHP-FPM

PHP-FPM是PHP FastCGI运行模式的一个进程管理器,并且作为web服务器和php-cli之间的桥梁,负责转发来自web服务器的http请求以及将php处理好的response转发给web服务器。
nginx和php-fpm之间的关系
一、 PHP-FPM有以下特点:

  1. 自从PHP5.4之后,PHP-FPM就汇入php的核心代码里了,在编译的时候”–enable-php-fpm”就可以了
  2. 区别于cgi的启动和退出的模式,php-fpm启动之后就会维护一定数量实现了php-cgi的进程,来处理请求
  3. php-fpm是管理一系列php-cgi的程序,因为php-cgi本身只能解析请求,并不会管理进程,所以需要一个程序来管理一系列进程
  4. php-fpm有两种监听模式,一种是监听TCP端口,另一种为Unix domain socket模式。如果你的web服务器和php-fpm不在同一台机器上时,就只能使用TCP端口模式,当然这种模式需要握手建立连接等过程后才能通信。如果你的web服务器和php-fpm在同一台机器上,就可以使用Unix domain socket,这种模式是可以在同一台机器上的不同进程间使用字节流或者数据队列进行数据通信,理论上会比第一种效率更高一点。

二、 Opcache
首先要了解一次完整的HTTP请求到PHP脚本的过程:
以nginx+php-fpm为例

  1. nginx识别请求的为php脚本,并把请求转给php-fpm
  2. php-fpm将请求进一步交给其中一个子进程
  3. 子进程找到对应的php脚本然后读取,编译成字节码或者操作码,执行
  4. 将生成的响应层一层层返回给http客户端

可以看到,由于php语言本身的特性,php脚本的执行是一边编译一边执行的,而且产生的不是机器码,而是中间码,再由解析器(Zend)来执行,所以速度上取决于编译的速度和解析器的性能。
自从php5.5之后,可以使用官方提供的Opcache,来提高性能。其中的原理就是,将中间码也就是缓存起来,假如第二还是执行同样的文件时,就可以直接将缓存的中间码给解析器解析就行了,省去了编译的过程,一定程度上提高了运行速度。

自己也稍微测试了一下,测试最简单的接口,速度从原来的105ms,下降到了45ms,快了近一倍。
未开启opcache
开启opcache

Welcome to my other publishing channels