Windows环境下PHP-CGI与Nginx运行一段时间后自动停止问题求助
Windows下php-cgi与Nginx运行15-20小时后同时崩溃的排查与解决
问题现象
Windows环境中使用php-cgi搭配Nginx运行PHP项目,初始15-20小时内运行正常,但之后php-cgi与Nginx服务会同时停止,重启服务后问题重复出现。启动批处理内容如下:
@ECHO OFF ECHO Starting PHP FastCGI... SET PHP_FCGI_MAX_REQUESTS=0 start C:\webserver\nginx\nginx.exe C:\RunHiddenConsole.exe C:\webserver\php\php-cgi.exe -b 127.0.0.1:9000 -c "C:\werbserver\php.ini"
排查与解决步骤
1. 修正批处理中的路径拼写错误
批处理中指定的PHP配置文件路径C:\werbserver\php.ini存在拼写错误(werbserver应为webserver),错误路径会导致php-cgi无法加载正确配置,长期运行易引发异常崩溃。修正后的批处理:
@ECHO OFF ECHO Starting PHP FastCGI... SET PHP_FCGI_MAX_REQUESTS=1000 start C:\webserver\nginx\nginx.exe C:\RunHiddenConsole.exe C:\webserver\php\php-cgi.exe -b 127.0.0.1:9000 -c "C:\webserver\php.ini"
2. 限制PHP_FCGI_MAX_REQUESTS避免内存泄漏
当前设置PHP_FCGI_MAX_REQUESTS=0意味着php-cgi会持续处理请求不重启,PHP长期运行易出现内存泄漏,累积到一定程度会触发崩溃。建议设置合理值(如1000),让php-cgi处理指定请求数后自动重启:
SET PHP_FCGI_MAX_REQUESTS=1000
同时在Nginx的server配置块中添加对应配置,确保请求能平滑切换到新进程:
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_max_requests 1000; # 与PHP_FCGI_MAX_REQUESTS保持一致
3. 查看Windows系统事件日志定位崩溃原因
服务崩溃时,Windows事件查看器(事件查看器->Windows日志->应用程序/系统)会记录详细错误信息(如异常代码、内存地址、触发崩溃的模块),可通过这些信息精准定位问题(比如特定PHP扩展内存泄漏、Nginx资源耗尽)。
4. 替换php-cgi为Windows版PHP-FPM
php-cgi为单进程模式,稳定性弱于PHP-FPM。Windows下有官方或第三方编译的PHP-FPM版本,使用FPM可自动管理PHP进程生命周期,自动重启崩溃进程,大幅提升整体稳定性。
5. 检查系统资源占用情况
- 打开任务管理器,监控php-cgi和Nginx进程的内存、CPU占用,确认是否存在资源持续增长不释放的情况;
- 检查Windows虚拟内存设置,确保虚拟内存容量足够(建议设为物理内存的1.5-2倍);
- 关闭不必要的后台程序,释放系统资源。
6. 更新PHP与Nginx到稳定版本
旧版本的PHP或Nginx可能存在已知的内存泄漏、崩溃bug,更新至最新稳定版(如PHP 7.4/8.x稳定版、Nginx Windows稳定版)可修复多数旧版本问题。
内容的提问来源于stack exchange,提问作者user3606682
相关产品推荐
相关产品推荐

