Apache 不记录 php 错误

Posted

技术标签:

【中文标题】Apache 不记录 php 错误【英文标题】:Apache does not log php errors 【发布时间】:2012-01-02 19:53:46 【问题描述】:

php 通过 CLI 成功将错误记录到 /var/log/php_errors.log。

但是 apache + php 不会记录错误。

[bla@notebook ~]$ apachectl -v
Server version: Apache/2.2.17 (Unix)
Server built:   May 19 2011 03:15:39

[bla@notebook ~]$ php -v
PHP 5.3.6 with Suhosin-Patch (cli) (built: Mar 23 2011 13:28:00) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

php.ini 我有:

display_errors = On
error_reporting = E_ALL | E_STRICT
log_errors = On
error_log = php_errors.log

httpd.conf

ErrorLog "/var/log/httpd/error_log"

权限:

[bla@notebook /]$ ls -la /var/log/httpd/
-rwxrwxr-x 1 root root 133351 21.11.2011 11:18 access_log*
-rwxrwxr-x 1 root http   1307 21.11.2011 11:18 error_log*

[bla@notebook /]$ ls -la /var/log/php_errors.log 
-rwxrwxr-x 1 root http 521 14.11.2011 17:31 /var/log/php_errors.log*

如您所见,Apache 守护进程有权写入日志文件。

在 /var/log/php_errors.log 和 /var/log/httpd/error_log 中仍然没有来自 Apache 或 PHP 的错误。

更新 1。

在 php.ini 中更改了这一行:

error_log = php_errors.log 

到完整路径:

error_log = /var/log/php_errors.log 

权限没问题。但如果有人也有问题,您可以调试设置日志文件 0777 的权限或更改文件所有者。

【问题讨论】:

与 php.ini 有什么关系?其中一些默认情况下会在 CLI 中自动运行,但在 Web 服务器中运行时必须启用。 例如可以缺少哪些设置?找不到。 如果在虚拟主机中忘记配置:php_admin_value error_reporting 'E_ALL & ~E_STRICT'. 【参考方案1】:

检查您正在访问哪个 PHP 脚本,以及如何配置 Apache 以访问它。

在某些配置中(例如虚拟主机、特定目录...),error_log 文件可以设置为与默认路径/名称不同的路径/名称。

然后我建议检查您的 Apache 配置文件。

【讨论】:

我没有覆盖虚拟主机配置中的 error_log 路径:[bla httpd]# find . | xargs grep "ErrorLog" ./conf/extra/httpd-ssl.conf:ErrorLog "/var/log/httpd/error_log" ./conf/httpd.conf:# ErrorLog: The location of the error log file. ./conf/httpd.conf:# If you do not specify an ErrorLog directive within a <VirtualHost> ./conf/httpd.conf:ErrorLog "/var/log/httpd/error_log"【参考方案2】:

对于 Apache 和 CLI,通常有两个单独的 php.ini 文件 - 您确定您查看的是正确的吗?

编辑:

我能想到的另外 2 个选项:

一些 Apache 指令弄乱了 PHP 的日志路径(或者禁用了日志记录选项,尽管这种情况不太可能发生) - 尝试在 php.ini 中设置日志文件的绝对路径(@Frosty Z 提出了一些建议像这样) 我注意到您的 PHP 安装应用了 Suhosin 补丁,该补丁进行了一些限制性修改以提高安全性。虽然理论上http 用户组中的用户有足够的权限写入日志文件 - 可能存在一些类似 suphp 的行为,并且当您的脚本通过网络访问时,它使用/作为用户名执行设置为它的所有者(即脚本的文件所有者) - 尝试更改它。

【讨论】:

我的情况是只有一个 php.ini。我正在使用chakra-linux.org/about.html【参考方案3】:

过去,我在两种情况下没有错误日志:

    运行 Apache 的用户无权修改 php_error_log 文件。 由于.htaccess 的错误配置而发生错误500,例如错误的重写模块设置。在这种情况下,错误会记录到 Apache error_log 文件中。

【讨论】:

如何找到Apache在哪个用户下运行 请看这里:finding-out-what-user-apache-is-running-as【参考方案4】:

我遇到了同样的问题。

在 php.ini 中设置 log_errors_max_len = 0 对我有用。

PHP manual:

设置 log_errors 的最大长度(以字节为单位)。在错误日志中 添加有关来源的信息。 默认为 1024 和 0 允许根本不应用任何最大长度。应用此长度 记录错误、显示错误以及 $php_errormsg,但不是 显式调用函数,例如 error_log()。

【讨论】:

【参考方案5】:

httpd.conf 不是唯一可以放置 Apache 配置的地方,

例如:

如果您使用安全连接https://,您的额外配置将占上风,您需要在/opt/local/apache2/conf/extra/httpd-ssl.conf等文件中查找配置

你可以找到类似的东西:

ErrorLog "/var/log/apache/ssl_error.log"

您将在普通日志文件中看到没有错误记录,但所有错误都会转到 ssl_error.log

【讨论】:

【参考方案6】:

这也可能是由 Apache 自己的 LogLevel 指令引起的,如果设置得太高会覆盖 PHP 的日志记录。但是,它不会覆盖 PHP 在页面上输出错误的能力,即 display_error,也不会影响 CLI PHP。如果您有特定的症状,值得研究一下。

【讨论】:

【参考方案7】:

检查正确服务器上的日志路径对我有帮助... facepalm

【讨论】:

以上是关于Apache 不记录 php 错误的主要内容,如果未能解决你的问题,请参考以下文章

php 不记录错误 log_errors=on,error_log 路径存在

如何将 PHP error_log 错误消息记录到 Apache 服务器 error_log?

PHP 错误未记录在单独的日志文件中

PHP错误日志记录文件位置确定

Apache + PHP配置

Apache Beam 记录带有错误标签的消息