不要问我为什么要用 phpStudy
TL;DR 太长不看
Windows 环境下的 PHP 7.2.1 / 7.1.13 这两个版本有问题getenv()
函数且第二个参数为 false
时php-cgi.exe
) 崩溃
然而遗憾的是
最绝的是
修复方法也很简单
下面开始讲废话
0x01 问题描述
因为某些原因
然后坑就来了
安装完 phpStudy 后error.log
2018/10/21 11:45:14 [error] 81019#14893: *10 WSARecv() failed (10054: An existing connection was forcibly closed by the remote host) while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /l.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"
呃127.0.0.1:9000
上的 PHP FastCGI 进程出了问题
0x02 问题排查
接着去看一下 PHP 的错误日志
phpStudy 中的 php.ini
默认设置了 log_errors = On
但是没有指定 error_log
的值error_reporting
设置正确error.log
2018/10/21 11:45:14 [error] 81019#14893: *16 FastCGI sent in stderr: "PHP Fatal error: Uncaught Error: Call to undefined function test() in E:\environment\bundle\php-study\PHPTutorial\WWW\l.php:183
Stack trace:
#0 {main}
thrown in E:\environment\bundle\php-study\PHPTutorial\WWW\l.php on line 183" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /l.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"
然而我并没有在 error.log
中找到任何 PHP 的错误日志error_log
设置为文件日志后
好吧
用关键词php-cgi.exe
进程开太少php-cgi.exe
看起来挺靠谱啊
为了验证php-cgi.exe
进程nginx.conf
如下
upstream php_fastcgi {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
server {
# ...
location ~ ^.+\.php {
# 原来是 fastcgi_pass 127.0.0.1:9000;
fastcgi_pass php_fastcgi;
# ...
}
}
重启 Nginx 后尝试访问之前出问题的页面php-cgi.exe
进程过少造成的
每次访问这个页面php-cgi.exe
进程就会异常退出
因为 phpStudy 自带守护进程php-cgi.exe
崩溃了也会马上新开一个php-cgi.exe
进程都会死掉然后马上变成新的
该页面中的某些 PHP 代码会造成 php-cgi.exe
进程崩溃
找到问题就好办了
<?php
echo getenv("HTTP_ACCEPT_LANGUAGE");
0x03 问题解决
Google 了一下getenv()
的第二参数为 false
php-cgi.exe
崩溃
解决方法也和上面说的一样
排查这问题前前后后花了我将近一天的时间