A. php-FPM详解
PHP-FPM是PHP FastCGI进程管理器,专为管理PHP进程池设计,用于接收web服务器请求。
第一部分,为什么出现PHP-FPM?PHP-FPM的诞生源自PHP-FastCGI的需求。为有效管理PHP-FastCGI而出现的程序。
第二部分,了解PHP-FastCGI。它只是一个解析PHP请求并返回结果的CGI程序,并不负责管理进程。
第三部分,为何不称为PHP-CGI?在PHP-FastCGI之前,存在PHP-CGI,但其执行效率低下,最终被PHP-FastCGI取代。
第四部分,解释FastCGI与CGI的区别。在FastCGI时代,当web服务器(如nginx)接收到请求并识别为动态PHP请求时,会将其转给PHP处理。在CGI模式下,每次请求时都需要读取php.ini配置,初始化执行环境,耗时且重复。
第五部分,FastCGI的效率提升。FastCGI允许一次启动一个主进程(master),读取一次配置,然后启动多个工作进程(worker)。当请求来临时,master将请求传递给worker,避免了重复的初始化工作。
第六部分,PHP-FPM的工作原理。PHP-FPM创建一个主进程来控制何时以及如何将HTTP请求转发给一个或多个子进程处理。主进程还负责管理进程的创建与销毁,以适应Web应用流量的变化。
安装部分,PHP在5.3.3之后将PHP-FPM整合到核心代码中,无需单独下载安装。只需在编译PHP源码时添加--enable-fpm即可启用PHP-FPM支持。
全局配置方面,CentOS中PHP-FPM的主配置文件为/etc/php7/php-fpm.conf,配置内容通常包括进程池定义。
在CentOS中,PHP-FPM主配置文件顶部引入了进程池定义文件,通常使用www.conf作为默认配置文件。进行必要的编辑保存后,重启PHP-FPM主进程。
PHP-FPM进程池的详细配置请参考php.net/manual/install文档。
针对Company开发环境的配置,提供测试环境与生产环境的具体配置示例。以nginx为例,说明如何转发请求给PHP-FPM。
最后,针对PHPer进阶时遇到的问题,提供了一系列资料,涵盖分布式架构、高可扩展性、高性能、高并发、服务器性能调优、TP6、Laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等高级进阶干货,需要的读者可以免费获取。
B. PHP中的FPM是做什么的
FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。它的功能包括:
支持平滑停止/启动的高级进程管理功能;
可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);
stdout 和 stderr 日志记录;
在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
文件上传优化支持;
"慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
动态/静态子进程产生;
基本 SAPI 运行状态信息(类似Apache的 mod_status);
基于 php.ini 的配置文件。
C. php-fpm特色功能
php-fpm的特色功能为用户提供了多种便利性和优化选项,这些特性以"不打断"的方式实现,既不影响php的基本功能,又能显着提升用户体验和服务器性能。
在默认设置下,如果php脚本出现语法错误,用户仅能收到一个空的"200 ok"页面,这显然不够友好。通过在php.ini中配置"error_header"选项,可以将错误码展示给用户,例如设置为"HTTP/1.0 550 Server Made Big Boo",从而中断web服务器请求并显示正确的错误页面。需要在php.ini中添加:"fastcgi.error_header = "HTTP/1.0 550 Server Made Big Boo"。在php-5.2.4中,已经实现了类似功能,如果脚本包含语法错误且display_errors设置为off,会立即返回"HTTP/1.0 500 Internal Server Error",但此行为与display_errors设置相关联。
针对大POST请求和文件上传的优化,php-fpm通过将请求体写入临时文件,然后通过fastcgi协议传递文件名而不是请求体,实现加速处理。此功能仅在php与web服务器运行在同一台机器上时有效。在nginx配置中,可以使用如下示例配置:将"fastcgi_pass_request_body"设置为"off","client_body_in_file_only"设置为"clean",并在fastcgi参数中添加"REQUEST_BODY_FILE"参数,指定请求体文件名。
php中无需进行额外配置,如果接收到"REQUEST_BODY_FILE"参数,将读取其中的请求体;如果没有该参数,则从fastcgi协议中读取请求体。结合使用内存文件系统(如Linux的tmpfs)可以进一步优化处理速度,例如设置"client_body_temp_path"以利用tmpfs。
为了提高某些php请求的处理速度,可以使用"fastcgi_finish_request()"特性。此特性允许在页面生成后进行某些处理,例如在memcached中保存session或处理上传的视频、统计等。此操作可以在响应输出被web服务器提供给客户端之前完成,同时触发"shutdown"函数运行。
通过配置"request_slowlog_timeout"选项,可以追踪执行缓慢的脚本并将其与调用栈一同记录在日志文件中,以帮助诊断问题。例如,设置如下配置:"request_slowlog_timeout"为5秒,"slowlog"设置为"logs/slow.log"。这样,当脚本运行超过5秒时,系统会记录其调用栈信息,可能是因为数据库响应速度慢导致的。