一、SAPI比较1、SAPI服务端应用程序编程接口是服务端与编程语言交互的接口。例如Linux命令行执行一段PHP代码。实际上,Linuxshell通过PHPSAPI传入一组参数,zend引擎执行后返回给shell。在PHP生命周期的每个阶段,一些与服务相关的操作都是通过SAPI接口实现的。php_sapi_name()可以查看当前SAPI接口的类型。如cli(php-r"echophp_sapi_name();"),fpm-fcgi等2.PHP运行加载的四个阶段①Minit模块初始化阶段,可以初始化php扩展,类库内部变量,注册常量,并定义模块使用的类等。②在Rinit请求初始化阶段,模块初始化激活后,会创建PHP运行环境,并初始化本次请求所需的环境变量,如$_SERVER、$_SESSION.③Rshutdown请求关闭阶段,进行最后的清理工作,释放处理本次请求的所有资源(应用变量)。请求的完成可能会一直执行到脚本完成,也可能通过调用die()或exit()函数来完成。④Mshutdown模块回收阶段,用于关闭自身的内核子系统,释放内存。3、SAPI5种运行模式①单进程模式(CLI、CGI),每执行一个PHP脚本,就会执行第二部分提到的四个INT和Shutdown事件。当用户请求数非常大时,会占用大量的内存、CPU时间等系统资源,导致系统开销较大②多进程模式(Apache下preforkMPM模式),会fork出很多子进程,每个子进程都有自己独立的子进程,PHP的生命周期就是调用MINT启动后执行多次请求(RINT/RSHUTDOWN)。Apache关闭或进程结束后,会调用MSHUTDOWN进行回收。在多进程模型中,每个子进程独立运行,不共享代码和数据,因此一个子进程的终止、退出和重新生成不会影响其他子进程的稳定性。③多线程模式(Apache2的WorkerMPM),在一个进程下创建多个线程,在同一个进程地址空间执行④fastCGI模式,nginx+php-fpm就是这种模式,fast-cgi是CGI的升级版,FastCGI可以作为一个常驻CGI,可以一直执行,运行后可以fork多个进程,不用花时间动态fork子进程。也不需要在每个请求上调用MINT/MSHUTDOWN。⑤嵌入式方式,允许用C/C++语言调用PHP提供的函数。运行方式与CGI相同,执行4个阶段。传递什么数据,传递什么格式,由CGI决定fastcgi:是一种提高CGI性能的协议。不需要每次都初始化。如果进程不够,它会提前启动几个进程。如果进程太空闲,它会停止一些。fastCGI管理进程,提高性能,节省资源。php-fpm:实现fastCGI协议的程序,被PHP官方接受,同时提供进程管理功能。进程包括两个进程:master进程和worker进程。master进程只有一个,负责监听端口分发请求和接收来自WebServer的请求,而worker进程一般有多个(具体数量根据实际需要配置),每个进程内嵌一个PHP解释器,这是实际执行的PHP代码。php-cgi:cgi解释器进程的工作原理FastCGI:在WebServer启动时加载FastCGI进程管理器。FastCGI进程管理器自己初始化,启动多个CGI解释器(可以看到多个php-cgi),等待WebServer的响应。连接当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到CGI解释器。WebServer向FastCGI子进程发送CGI环境变量和标准输入php-cgiFastCGI子进程在处理后从同一个连接返回标准输出和错误信息给WebServer。当FastCGI子进程关闭连接时,请求被通知处理完成。然后FastCGI子进程使用FastCGI等待并处理来自FastCGI继承管理器的下一个连接,开销很小。此外,与数据库和Memcache的持久连接也有效。数据库短连接connect:在请求关闭阶段,请求使用的资源被释放,数据库连接句柄也会被释放。数据库长连接pconnect:请求关闭后,PHP会保持连接。当第一次有请求打开同一个连接时,PHP直接取出存储的句柄,省去了建立连接的过程。php-fpm还需要配合数据库的一些配置来实现长连接。一个进程容纳一个连接,数据库连接数就是子进程数,所以数据库允许的连接数必须大于子进程数。三、php-fpm进程管理的三种模式php-fpm支持三种运行模式,分别是static、ondemand和dynamic,默认是dynamic。static:静态模式,启动时分配一个固定的worker进程。只需要考虑max_children的个数,这个个数取决于cpu的个数和应用的响应时间。ondemand:按需分配,启动时不分配进程,只有收到用户请求时才启动进程。master进程检查工作进程的数量是否有限制,是否有空闲的工作进程,如果没有工作进程则创建一个新的工作进程。在高流量的系统上,master进程会变得繁忙,占用系统cpu资源,不适合部署在高流量的环境中。dynamic:在动态模式下,在启动时分配一个固定的进程。随着请求数量的增加,worker进程在设定的浮动范围内进行调整。pm=dynamic//动态进程管理,对于专用服务器,可以设置成static,一次最多静态启动子进程数,不会改变。pm.max_children=50//最大子进程数,psaux可以查看pm.start_servers=20//服务启动时会启动的进程数pm.min_spare_servers=5//最小子进程数idlechildprocesses是有保证的,如果idleprocess小于这个值,php-fpm服务会新建一个子进程。pm.max_spare_servers=35//保证最大空闲子进程数,如果空闲进程高于这个值,就会被清理掉。pm.max_requests=500//定义一个子进程处理的最大请求数。当达到这个值时,进程会自动退出。目的是控制内存溢出,使内存保持在可控范围内。但是如果设置的很小,有可能多个进程同时达到这个值,同时重启,会导致PHP停止响应,直到重启完成。设置为0以始终接受请求。4.php-fpmslowlog如果一个php网站可以访问,说明访问速度变慢了。通过php-fpm的慢执行日志可以清楚的了解到php脚本执行时间长的地方,可以定位到具体的代码行vim/usr/local/php/etc/php-fpm.d/www.confrequest_slowlog_timeout=1//timeoutslowlog=/usr/local/php/var/log/www-slow.logrestartphp-fpm/etc/init.d/php-fpmreload我加了一行sleep(3);到php文件,运行后返回结果参考1,https://www.jianshu.com/p/c9a...php-fpm进程管理的三种模式2.https://www.jb51.net/article/...SAPI的五种运行模式3.http://blog.51cto.com/1260661...php-fpm慢Log4,https://www.cnblogs.com/wpjam...php-fpm与mysql长连接
