PHP7内核CGI和FastCGI详解
CGI:是一个用于网络服务器和网络应用程序之间数据交换的协议。FastCGI:和CGI一样,是一种通信协议,但比CGI更高效。
PHP-CGI:是由PHP (Web应用程序)提供给Web服务器的CGI协议的接口程序。
PHP-FPM:是PHP(Web Application)提供给Web Server的FastCGI协议的接口程序,也提供了相对智能的任务管理
CGI工作流
1.如果客户端请求index.html,网络服务器将在文件系统中找到该文件,并将其发送到浏览器,静态数据将在浏览器中分发。
2.当Web服务器收到index.php的请求时,会启动相应的CGI程序,也就是PHP的解析器。接下来,PHP解析器解析php.ini文件,初始化执行环境,然后处理请求,以CGI指定的格式返回处理后的结果,退出进程,Web服务器将结果返回给浏览器。
FastCGI工作流
1.如果客户端请求index.html,网络服务器将在文件系统中找到该文件,并将其发送到浏览器,静态数据将在浏览器中分发。
2.Web Server收到index.php的请求后,FastCGI程序(FastCGI启动时初始化执行环境,各CGI进程池中的CGI进程共享执行环境)选择CGI进程池中的一个CGI进程处理该请求,然后以指定的CGI格式返回处理结果,继续等待下一个请求。
PHP的实现-FPM
1.1 .的实施。PHP-FPM是创建一个主进程,在主进程中创建一个工作池并让它监听套接字,然后分叉出多个子进程(work)。这些子流程各自接受请求,子流程的处理非常简单。它在启动后阻塞accept,并在请求到达后开始读取请求的数据。读取后,开始处理,然后返回。在此期间,它将不会收到其他请求。也就是说,PHP-FPM的子进程只能同时响应一个请求,并且只有在处理完这个请求之后才会接受下一个请求。
2.2的主进程。PHP-FPM不直接与工作进程通信。主进程通过共享内存获取工作进程的信息,例如工作进程的当前状态和已处理请求的数量。当主进程想要杀死一个工作进程时,它通过发送一个信号来通知工作进程。
3.PHP-FPM可以同时监听多个端口,每个端口对应一个工作池,每个池对应多个工作进程
工作流
1.等待请求:工作进程在fcgi_accept_request()处阻塞等待请求;
2.解析请求:fastcgi请求到达后由工作人员接收,然后开始接收和解析请求数据,直到请求数据完全到达;
3.请求初始化:执行php_request_startup(),它将调用每个扩展的PHP _ rinit _ function();
4.编译执行:php_execute_script()完成php脚本的编译执行;
5.关闭请求:请求完成后,执行php_request_shutdown()。在这个阶段,将调用每个扩展的PHP _ rshuttown _ function(),然后进入步骤(1)等待下一个请求。
主流程管理
1.static:这种方式比较简单,在启动时,主机会根据pm.max_children配置fork来生成相应数量的worker进程,也就是说worker进程的数量是固定的。
2.dynamic:动态流程管理首先,fpm启动时,根据pm.start_servers初始化一定数量的工作人员。在运行期间,如果主服务器发现空闲工作进程的数量低于pm.min_spare_servers的配置数量(这意味着有很多请求,工作进程无法处理),它将分叉工作进程。但是,员工总数不能超过pm.max_children。如果主服务器发现空闲工作人员的数量超过pm.max_spare_servers(这意味着空闲工作人员太多),它会杀死一些工作人员,避免占用太多资源。主服务器通过这四个值控制工人的数量
3.ondemand:很少使用。启动时,不会分配工作进程,在发出请求后,会将分叉工作进程通知给主进程。工作进程的总数不超过pm.max_children,并且工作进程不会在处理完成后立即退出,然后在空闲时间超过pm.process_idle_timeout时退出。
PHP-FPM事件管理器
1.sp[1]流水线可读事件:该事件由主机用来处理信号
2.FPM _ PCTL _ perform _ idle _ server _ maintenance _ heart beat():这是流程管理实现的主要事件。主机启动定时器,每1秒触发一次,主要用于动态和按需模式下的工作人员管理。主服务器定期检查每个工作进程池中的工作进程数,并通过此计时器控制工作进程数
3.fpm_pctl_heartbeat():此事件用于限制工作人员处理单个请求所花费的最长时间。php-fpm.conf有一个request_terminate_timeout的配置项。如果一个工作进程处理一个请求所花费的总时间超过这个值,主进程将向这个工作进程发送kill -TERM信号来终止这个工作进程。该配置单位为秒,默认值为。
4.主进程在fpm _ PCTL _ ON _ Socket _ Accept(): ON demand模式下监控的新请求到达事件,因为当fpm在按需模式下启动时不会预创建工作进程,当有请求时会生成子进程,所以请求到达时需要通知主进程。
版权声明:PHP7内核CGI和FastCGI详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。