我无法找到 php-fpm 进程将其错误输出记录到与脚本结果相同位置的原因。
我有一个 Apache 服务器,它使用以下命令将请求传递给 php-fpm 进程:
ProxyPassMatch [Regex to match] fcgi://127.0.0.1:9000/path/to/php/script.php
我遇到的问题是返回的 html 文档看起来像这样:
<!DOCTYPE html>
<html>
<head>
<br />
<b>Warning</b>: Undefined array key... etc
<br />
</head>
<body>
Rest of html works as expected
</body
</html>
php-fpm 遇到的错误消息与 html 输出一起传回 Apache,并显示在我的 Web 浏览器中。
尝试寻找问题的根源
由于错误消息源自 php-fpm,我尝试在 php-fpm conf 文件中寻找原因。
我从二进制文件运行 php-fpm 作为守护进程:
./php-fpm --allow-to-run-as-root
我使用以下命令确认 conf 文件的位置符合我的预期:
./php-fpm -tt
打印多行输出并附加以下内容:
/srv/php/conf/php-fpm.conf test is successful
确认正在使用的conf文件的位置。
我认为与错误日志记录相关的 conf 文件中的行是:
[global]
error_log = log/php-fpm_error.log
log_level = debug
[www]
listen = 127.0.0.1:9000
user = myuser
group = mygroup
access.log = log/$pool_access.log
access.format = [default access string format]
slowlog = log/$pool_slow.log
catch_workers_output = 1
decorate_workers_output = no
php_flag[display_errors] = off
php_admin_value[error_log] = /srv/php/log/$pool_error.log
php_admin_flag[log_errors] = on
我尝试将该行添加daemonize = no
到[global]
选项并启动 fpm。当发出请求时,这只会显示一条event triggered
通知,对我的调试工作没有帮助。
有解决办法,但是为什么呢?
当我输入这个问题时,我尝试添加以下行:
php_flag[display_errors] = off
这既可以防止 PHP 错误记录到传递给 Apache 的结果中,也可以开始将错误记录到文件中/srv/php/log/$pool_error.log
。
默认配置文件指出选项php_flag
、php_admin_flag
等用于覆盖 php.ini 设置的值。我的问题是,由于我没有 php.ini 文件,我预计不会有任何内容需要覆盖。也许这些值是在我配置 PHP 预构建时设置的?如能提供任何有关解决方案的建议,我将不胜感激。
此外,我在网上找不到任何关于 PHP-FPM 如何将其结果传递给 Apache 的文档。Apache 会监听 stdout 吗?错误是否记录到 stderr,然后定向到指定的日志文件?如果是这样,为什么在我解决问题之前将错误传递到 stdout?
谢谢 !