CGI/FastCgi系列
CGI
CGI是为了保证web server传递过来的数据是标准格式。
-
例如nginx只是内容的分发者。请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,那么他会把这个请求简单处理后交给PHP解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。
-
每次请求,都创建一个cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程,fork-and-execute模式。
-
CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。
FastCgi
-
标准的cgi每次都会执行
PHP解析器会解析php.ini文件,初始化执行环境
这一步 -
Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。
-
缺点 修改了
php.ini
后没办法直接生效,因为跳过了标准CGI每次都会执行的解析 -
属于一种增强协议
PHP-CGI
- 早期php官方出品的FastCgi管理器,实现了FastCgi协议,属于具体实现方式。
- 不支持平滑重启,改了php.ini就要kill掉原来的php-cgi再重新启动才能生效
- 不支持动态worker调度,只能一开始指定要起几个worker
APACHE2HANDLER
- 把php当作Apache服务的模块,进而实现了FastCgi协议,属于具体实现方式。
- Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出现,就立即使用这些空余的子进程进行处理
- 专门用于apache服务器
- 也不支持平滑重启
PHP-FPM
-
也是官方的fastcgi管理器,属于具体实现方式。fastcgi是一个协议,php-fpm实现了这个协议。并作为fastcgi进程的管理器,来管理fastcgi进程,同时解决了修改php.ini后没办法直接生效的问题
-
常用于nginx
-
支持动态调节,当worker不够用时,master可以启动几个worker等着;当然空闲worker太多时,就会停掉一些
-
php-fpm解决修改php.ini配置平滑重启的方式是:
- php-fpm的热加载和类似nginx,收到重新加载配置的信号的话,先kill掉空闲worker进程,而正在处理连接的子进程继续处理请求,请求结束再退出操作。同时master进程会重新拉起新的worker进程,保证新的请求用上解析新配置后的worker。这样就实现平滑过渡。
ISAPI系列
- 是微软专门提供的一套面向WEB服务的接口协议,它能实现CGI/FASTCGI提供的全部功能
- 常用于IIS服务器
- 他启动的worker的不是进程而是线程
线程安全
-
CGI/FASTCGI协议都明显是单独提供一个进程来处理请求,因此都不存在线程安全的问题,但这只是在Linux上。
-
在windows上就是不一样,ISAPI使用了多线程来实现而不是多进程,许多php模块是按照多进程思想来实现的,所以不是线程安全的,所以需要使用Thread Safe的PHP
-
windows上的xampp,虽然是apache服务器,即使用了APACHE2HANDLER模式,也是多线程实现,所以用了线程安全方式
phpstorm
- 在搭配xampp情况下
- 如果是PHP文件运行在本地的apache服务器,使用的是APACHE2HANDLER模式,如果修改
php.ini
,需要重启apache服务器,使master进程重新加载配置 - 而如果使利用phpstorm本身作为服务器启动,使用的则是IDE实现FastCgi协议的模式,如果修改
php.ini
,则需要重启phpstorm,使master进程重新加载配置
- 如果是PHP文件运行在本地的apache服务器,使用的是APACHE2HANDLER模式,如果修改