php运行模式与生命周期

cgi 协议模式

cgi模式 通用网关接口(Common Gateway Interface),它允许web服务器通过特定的协议与应用程序通信, 调用原理大概为:
用户请求->Web服务器接收请求->fork子进程 调用程序/执行程序->程序返回内容/程序调用结束->web服务器接收内容->返回给用户 由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低
PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程

fast-cgi 协议模式

fast-cgi是cgi模式的升级版,它像是一个常驻型的cgi,只要开启后,就可一直处理请求,不再需要结束进程, 调用原理大概为:
web服务器fast-cgi进程管理器初始化->预先fork n个进程
用户请求->web服务器接收请求->交给fast-cgi进程管理器->fast-cgi进程管理区接收,给其中一个空闲fast-cgi进程处理->处理完成,fast-cgi进程变为空闲状态,等待下次请求->web服务器接收内容->返回给用户

注意,fast-cgi和cgi都是一种协议,开启的进程是单独实现该协议的进程 Fastcgi是CGI的升级版,一种语言无关的协议,FastCGI是用来提高CGI程序性能的

php-fpm跟php和php-cgi都能解释php代码,只不过,php(强调一下这是可执行文件,在win下叫php.exe)是cli模式调用,即用命令调用,而php-cgi和php-fpm可以通过“网络”来调用,而所使用的网络协议叫“fastCGI协议”,只不过php-fpm比php-cgi高级很多
php-cgi则提供了fastCGI接口,fastCGI接口是一种“网络接口”,你可以通过网络的方式去调用它,比如nginx调用php-cgi可以用“fastcgi_pass 127.0.0.1:9000;”这样调用
win不支持php-fpm,因为php-fpm是使用Linux的fork()来做的,所以win下面基本上还是使用php-cgi

php-fpm

PHP-FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。

它的功能包括:

  • 支持平滑停止/启动的高级进程管理功能;具体:对于php.ini文件的修改,php-cgi进程是没办法平滑重启的,有了php-fpm后,就把平滑重启成为了一种可能,php-fpm对此的处理机制是新的worker用新的配置,
  • 可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);
    stdout 和 stderr 日志记录;
  • 在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
  • 文件上传优化支持;
  • "慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
具体:比如使用php-fpm.conf配置慢日志
slowlog = /usr/local/var/log/php-fpm.log.slow
request_slowlog_timeout = 5s
  • fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
  • 动态/静态子进程产生;
  • 基本 SAPI 运行状态信息(类似Apache的 mod_status);
  • 基于 php.ini 的配置文件。具体:PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载
    php-fpm.conf是PHP-FPM进程管理器的配置文件,php.ini是PHP解析器的配置文件

工作原理:

它的工作原理大概为:
php-fpm启动->生成n个fast-cgi协议处理进程->监听一个端口等待任务
用户请求->web服务器接收请求->请求转发给php-fpm->php-fpm交给一个空闲进程处理
->进程处理完成->php-fpm返回给web服务器->web服务器接收数据->返回给用户
nginx+php-fpm 就是用的以上的方法

Nginx 不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是 socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序php-fpm),这个 wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI 接口,wrapper接纳到请求,然后派生出一个新的进程,这个进程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据 通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个 运作过程。

FastCGI的wrapper 指的就是FastCGI进程管理器。
php-cgi,它是cgi协议的解析器(CGI程序),然后通过调用php的php_execute_script函数来解析和运行php脚本 也支持fastcgi协议
nginx只能解析请求,返回结果,不会管理进程,所以就出现了一些能够调度php-cgi进程的程序

https://note.youdao.com/s/KcGOvImu 多版本PHP同时运行与NGINX和php联系php-cgi php-fpm

模块模式

apache+php运行时,默认使用的是模块模式,它把php作为apache的模块随apache启动而启动,接收到用户请求时则直接通过调用mod_php模块进行处理,详细内容可自行百度

php-cli模式 除了php-cli的模式,都定义为常规web访问模式

php-cli模式属于命令行模式,对于很多刚开始学php就开始wamp,wnmp的开发者来说是最陌生的一种运行模式
该模式不需要借助其他程序,直接输入php xx.php 就能执行php代码
命令行模式和常规web模式明显不一样的是:
https://www.php20.cn/noobCourse/noobCourse/RunMode/php-cli/Introduction.html
没有超时时间
默认关闭buffer缓冲
STDIN和STDOUT标准输入/输出/错误 的使用
echo var_dump,phpinfo等输出直接输出到控制台
可使用的类/函数 不同
php.ini配置的不同

生命周期

对象池需要从php的生命周期说起,php的应用大部分都是web网站,而大部分web网站使用的都是cgi模式进行运行的,导致php生命周期跟随着请求结束而结束,从而没有对象池的概念

cgi模式的一次请求可以分为以下几步:
1:用户请求
2:web服务器(apache,nginx,iis等)接收请求
3:服务器通过cgi协议调用php,运行php文件
4:php文件处理逻辑,返回数据,php进程 销毁/回收(该次执行的php变量内存等全部回收)
5:web服务器接收数据,返回给用户,web服务器关闭连接
6:用户接收数据,用户关闭连接

在这个过程中,是根本没有对象池概念的,因为php的变量是随着用户的请求而销毁,无法把php的变量留给下一个用户进行执行
这就导致了如果用户1请求,需要new 一个对象,那么用户1请求完毕将会销毁,用户2需要重新再new一个对象,再销毁。。。。。如此反复。

php-cli模式下 while(1) 可以直接用外部的new shell脚本运行

posted @ 2022-06-05 18:05  citybear  阅读(89)  评论(0编辑  收藏  举报