共计 1770 个字符,预计需要花费 5 分钟才能阅读完成。
在服务器上,当咱们查看 php 过程时,全都是 php-fpm 过程,大家都晓得这个就是 php 的运行环境,那么,它到底是个什么货色呢?
PHP-FPM 简介
PHP-FPM,就是 PHP 的 FastCGI 管理器,用于替换 PHP FastCGI 的大部分附加性能,在 PHP5.3.3 后曾经成为了 PHP 的标配。
有小伙伴要问了,FastCGI 又是什么鬼?CGI 程序又叫做“通用网关接口”,就是让 Web 服务器和你的应用程序进行交互的一个接口。就像 nginx 中须要配置的 fastcgi_pass,个别咱们会应用 127.0.0.1:9000 或者 unix:/tmp/php-cgi.sock 来配置这个参数。它的意思就是通知 nginx,过去的申请应用 tcp:9000 端口的监听程序来解决或者应用 unix/socket 来解决。它们都是指向的 PHP 运行程序。
再说得艰深一点,咱们运行 php 脚本用的是
php aaa.php
php-fpm 就相当于是这个 php 命令。nginx 通过 fastcgi_pass 来运行 php $nginx_root(nginx 配置文件中网站根目录 root 配置) 下的 index.php。所以,如果你用的是 python 或者其余什么语言,都能够用它们的 cgi 程序来让 nginx 调用。
FastCGI 和 CGI 又有什么不同呢?FastCGI 是启动一个 socket 接口,服务器利用不须要本人去运行 php,只须要向这个 socket 接口提交申请就能够了。
php-fpm 在编译 php 时须要增加 –enable-fpm。一些通用的集成安装包如 lnmp、phpStudy 等都会默认编译并应用 php-fpm,毕竟是标配。
tcp socket 与 unix socket
上文中说过 nginx 能够应用 127.0.0.1:9000 和 unix:/tmp/php-cgi.sock 这两种形式来调用 php-fpm。它们有什么区别呢?
前者,个别带 9000 端口号的,是 tcp 模式的调用。也就是 php-fpm 启动了一个监听过程对 9000 端口进行监听。它会调起一个 tcp/ip 服务,nginx 在调用的时候会走一次 tcp 申请流程,也就是 3 次握手 4 次挥手,会走到网络七层中的第四层传输层。相对来说这种形式性能会稍差一点,启动 php-fpm 后应用 nestat 查看端口中会呈现 9000 端口的占用。
后者,应用的是 unix 套接字 socket 服务,通过 sock 文件来替换信息,性能绝对好一些,因为它没有 tcp 连贯过程,也不会有 9000 端口的占用。
对于高负载大访问量的网站还是举荐应用 unix 形式,对于一般小网站来说,无所谓应用哪个都能够,tcp 形式反而更容易配置和了解,也是 php-fpm.conf 中默认的监听形式。
php-fpm.conf 配置中的 listen 属性用来配置监听,这里的配置要和 nginx 中的统一,应用 tcp 的就监听 127.0.0.1:9000,应用 unix 的就设置成 /tmp/php-cgi-56.sock。
PHP-FPM 的性能
以下内容摘自官网文档:
- 反对平滑进行 / 启动的高级过程治理性能
- 能够工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和应用不同的 php.ini 配置文件(可取代 safe_mode 的设置)
- stdout 和 stderr 日志记录
- 在发生意外状况的时候可能重新启动并缓存被毁坏的 opcode
- 文件上传优化反对
- “ 慢日志 ” – 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,能够应用 ptrace 或者相似工具读取和剖析近程过程的运行数据)运行所导致的异样迟缓;
- fastcgi_finish_request() – 非凡性能:用于在申请实现和刷新数据后,持续在后盾执行耗时的工作(录入视频转换、统计解决等)
- 动静/动态子过程产生
- 根本 SAPI 运行状态信息(相似 Apache 的 mod_status)
- 基于 php.ini 的配置文件
本文参考:
- https://www.php.net/manual/zh/install.fpm.php
- https://www.cnblogs.com/sunlong88/p/9001184.html
- https://www.jianshu.com/p/34a20e8dbf10
- https://blog.csdn.net/erlib/article/details/38488937