关于php:PHPFPM-进化史

4次阅读

共计 1084 个字符,预计需要花费 3 分钟才能阅读完成。

最近有幸读到一篇文章,一文将 CGI 的进化史讲的特地具体,尽管我本人之前也整顿过 CGI、FastCGI、PHP-FPM 相干的笔记,然而并没有从原理的角度来意识 CGI。

CGI 的诞生

早些年的 Web 利用很简略,客户端通过浏览器发动申请,服务端间接返回响应。

随着互联网的倒退,简略的 Web 利用曾经不能满足开发者们了。
咱们心愿 Web 服务器有更多的性能,飞速发展的同时还能让不同语言的开发者也能退出。

CGI 协定协定的诞生就是 Web 服务器和其余畛域的开发者在保障恪守协定的根底上,剩下的能够自由发挥,而实现这个协定的脚本叫做 CGI 程序。

CGI 协定规定了须要向 CGI 脚本设置的环境变量和一些其余信息,CGI 程序实现某一个性能,能够用 PHP,Python,Shell 或者 C 语言编写。

在没有 CGI 之前,其余语言如果须要接入 Mysql 或者 Memcache,还须要应用 C 语言,但有了 CGI 协定,咱们的 Web 解决流程能够变成下图这样:

FastCGI 的诞生

CGI 程序存在致命的毛病:每当客户端发动申请,服务器将申请转发给 CGI,WEB 服务器就申请操作系统生成一个新的 CGI 解释器过程(如 php-cgi),CGI 过程则解决完一个申请后退出,下一个申请来时再创立新过程。

咱们晓得,执行一个 PHP 程序的必须要先解析 php.ini 文件,而后模块初始化等等一系列工作,每次都重复这样十分浪费资源。

FastCGI 协定在 CGI 协定的根底上,做出了如下扭转:

  1. FastCGI 被设计用来反对常驻(long-lived)利用过程,缩小了 fork-and-execute 带来的开销
  2. FastCGI 过程通过监听的 socket,收来自 Web 服务器的连贯,这样 FastCGI 过程能够独立部署
  3. 服务器和 FastCGI 监听的 socket 之间依照音讯的模式发送环境变量和其余数据

咱们称实现了 FastCGI 协定的程序为 FastCGI 程序,FastCGI 程序的交互方式如下图所示:

PHP-FPM 的诞生

FastCGI 程序诚然曾经很好了,但咱们的需要总是有点刻薄,它还是存在一些显著毛病的:

  1. 当咱们更改配置文件 (php.ini) 后,php-cgi(FastCGI 程序)无奈平滑重启
  2. 咱们 fork 的过程个数和申请量反比,申请忙碌时 fork 过程多,动静调整 php-cgi还没做到

下面提及 php-cgi 实现的 FastCGI 问题官网没有解决,侥幸的是有第三方帮咱们解决了,它就是 php-fpm

它能够独立运行,不依赖 php-cgi,换句话说,它本人实现了 FastCGI 协定并且反对过程平滑重启且带过程治理性能。

参考链接

  • 从 CGI 到 FastCGI 到 PHP-FPM
正文完
 0