php cgi

cgi

  • 通用网关接口(啥意思?),我们可以认为他是已做协议,作为web服务处理请求的协议.
  • web server(比如说nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。
  • 好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。
  • Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。
  • 仔细想想,你在PHP代码中使用的用户从哪里来的。
  • 当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器.

fastcgi

  • 也是一种协议,只不过是cgi的优化版.

php-fpm

  • 是对php-cgi的改进版,它直接管理多个php-cgi进程/线程.
  • 前面说了,php-fpm是php-cgi的进程管理器。
  • 这种交互方式实际上是让php-cgi以独立于httpd的方式存在,目前基本使用php-fpm的方式管理php-cgi进程。
  • 也就是说,这种模式下,php-cgi和httpd已经分离了,它们的分离意味着请求的动静分离变为可能:httpd和php-fpm分别运行在不同服务器上。
  • 动静分离后,压力也分散到各自的服务器上.
  • 是的,修改php.ini之后,php-cgi进程的确是没办法平滑重启的。
  • php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

小结

当然,这些看完是不是一脸懵逼的, ps aux | grep php-fpm 你就能看到你想看到了,是不是php的进程都是被php-fpm掌控着