Skip to main content

了解 PHP-FPM、PHP-CLI、PHP-ZTS

PHP中CGI、CLI、FPM是什么

php-cli和php-fpm FastCgi与PHP-fpm之间的关系

PHP-FPM 是什么?

感觉PHP-FPM进程数不够?

生产服务器 PHP-FPM 响应慢

记一次 PHP-FPM 可以创建慢日志,但是却不能写入内容的折腾过程

PHP 原理

php 实现一个简单的图片边缘检测

它们是用于不同目的的不同工具:

  • php-cli 是运行 PHP 脚本的独立工具,其方式与从命令行运行它的方式相同:php somescript.php.

  • php-fpm 是 PHP 的 FastCGI 服务器实现,您可以将其与兼容 FastCGI 的 Web 服务器(例如 Apache 或 Nginx)一起使用。

    PHP-FPM(FastCGI 进程管理器)是一种替代的 PHP FastCGI 实现,具有一些对任何规模的站点都很有用的附加功能,尤其是更繁忙的站点。

    这些功能包括:

    • 自适应进程生成(新!)

    • 基本统计(ala Apache 的 mod_status)(新!)

    • 具有优雅停止/启动的高级流程管理

    • 能够使用不同的 uid/gid/chroot/environment 和不同的 php.ini 启动 worker(替换 safe_mode)

    • 标准输出和标准错误记录

    • 在意外操作码缓存破坏的情况下紧急重启

    • 加速上传支持

    • 支持“慢日志”

    • 对 FastCGI 的增强,例如 fastcgi_finish_request() - 一个特殊函数,用于完成请求并刷新所有数据,同时继续做一些耗时的事情(视频转换、统计处理等)

PHP-FPM 是 PHP 的 FastCGI 实现。有关 PHP-FPM的更多信息,请参阅PHP-FPM网站

============

CLI

CLI(Command Line Interface,命令行接口)模式指的就是在命令行运行 PHP 脚本,一般用来写独立运行的脚本程序或者需要常驻内存的服务。

Apache Module

Module 模式使用 mod_php 在 web 服务器上执行 PHP 脚本代码。当使用 mod_php 时,PHP 解释器将会嵌入到 Apache fork 的每个进程中,这样每个 Apache work 进程都可以处理 PHP 脚本程序,而不用依赖任何外部程序。也可以理解为 Apache Module 把 PHP 脚本当做 Apache 服务扩展的一部分与 Apache 绑定一起使用。 缺陷: 由于 PHP 解释器嵌入每个 Apache work 进程中,即使是处理静态资源(静态文件或图片)时,进程中依然包含 PHP 解释器。 PHP 代码执行与 web 服务器耦合在一起,对安全和扩展不友好。 优势: PHP 解释器跟随 Apache 一起启动,不用每次执行 PHP 脚本都需要 fork 进程和加载资源,速度较快。

CGI

CGI(Common Gateway Interface,通用网关接口)是 web 服务器与应用程序之间的通信协议,用于 web 服务器(Nginx、Apache)与应用程序(PHP、Java)之间数据的传输。使用 CGI 模式的运行,当 web 服务在遇到 PHP 脚本的时候会将 PHP 程序提交给实现了 CGI 协议的应用程序(php-cgi.exe)解释,并将解释后的结果返回给 web 服务器。CGI 的应用主要在网站早期,由于其性能的缺陷现在已经很少使用了。 缺陷: 每有一个用户请求,都要先创建 CGI 的子进程,然后处理请求,处理完之后再结束该子进程,这就是 Fork-And-Execute 模式。当用户数量大时,就会创建大量的子进程,从而造成资源的浪费。而且每次 Fork 子进程时都需要加载 PHP 配置信息和初始化程序,反复执行重复的操作,这也是 CGI 性能低下的主要原因之一。 优势: 相比于 Apache Module 模式,CGI 将应用从 web 服务器中分离出来单独运行,而 Apache Module 模式将 PHP 作为 web 服务器的模块运行。这样程序的安全性、扩展性和代码结构的清晰性都有了很大提高。

FastCGI

FastCGI 模式是 CGI 模式的升级版。它结合了 Apache Module 模式和 CGI 模式的优势,也是现在使用最广泛的 PHP 运行模式。FastCGI 是一个常驻(long-live)型的 CGI,服务传入请求时,网络服务器通过 Unix 域套接字、命名管道或传输控制协议(TCP)连接向 FastCGI 进程发送环境变量信息和页面请求。响应通过相同的连接从进程返回到网络服务器,然后网络服务器将该响应传递给最终用户。连接可能在响应结束时关闭,但是 web 服务器和 FastCGI 服务进程都将持续,不会被销毁。每个单独的 FastCGI 进程在其生命周期内可以处理许多请求,从而避免了每个请求进程创建和终止的开销。php-fpm 就是 FastCGI 的实现。