2 台相同服务器上的 PHP 错误:一个记录到 php 错误日志,另一个记录 apache 错误日志

Posted

技术标签:

【中文标题】2 台相同服务器上的 PHP 错误:一个记录到 php 错误日志,另一个记录 apache 错误日志【英文标题】:PHP errors on 2 identical servers: One logs to php error log, the other logs apache error log 【发布时间】:2020-03-14 10:09:01 【问题描述】:

我有两台服务器,一台是公共服务器,一台是我的开发服务器。

两者都有相同的操作系统版本(CentOS7.7),都使用相同的 php 设置(remi),都有相同的 php.ini,都安装了相同的软件包(加上版本!) - 除了一些非apache/php 相关的包(开发机器)它们几乎是相同的机器。

两者都用于记录所有 php 错误和 error_log() 到 php.ini 定义的 error_log 文件:“/var/log/php”。我刚刚更新到 php 7.3,除日志记录外,一切正常。现在开发机记录到php日志,而公共机记录到apache错误日志。

我不知道为什么会这样,我需要一些帮助。

在我设置的 php.ini 文件中的两台机器上:

display_errors = Off
display_startup_errors = Off
log_errors = On
html_errors = Off
error_log = /var/log/php
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

两台机器上的权限都是正确的:

[user@PUBLIC /var/log/httpd] #>ls -la /var/log/php
-rw-rw----. 1 apachedaemon apachedaemon 199923 Nov 19 10:11 /var/log/php
[user@DEVELOPMENT /var/log] #>ls -la /var/log/php
-rw-rw---- 1 apachedaemon apachedaemon 158103 Nov 19 10:58 /var/log/php

在两台机器上我都有一个 php 脚本:

<?php
ini_set('log_errors','On');
ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
error_log("---------------------------------- start error test");
error_log($NotDefined);
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>php error test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>php error test</h1>
<p> </p>
</body>
</html>
<?php
error_log("end");
?>

在公共机器上我看到了这个:

==> 1.2.3.4_ssl_error_log <==
[Tue Nov 19 10:43:07.257073 2019] [php7:notice] [pid 4462] [client W.X.Y.Z:44844] ---------------------------------- start error test
[Tue Nov 19 10:43:07.257126 2019] [php7:notice] [pid 4462] [client W.X.Y.Z:44844] PHP Notice:  Undefined variable: NotDefined in /PATH/errorTest.php on line 8
[Tue Nov 19 10:43:07.257137 2019] [php7:notice] [pid 4462] [client W.X.Y.Z:44844]
[Tue Nov 19 10:43:07.257147 2019] [php7:notice] [pid 4462] [client W.X.Y.Z:44844] end

在开发机器上我看到了这个(这是正确的方法):

==> /var/log/php <==
[19-Nov-2019 10:30:28 Australia/Melbourne] ---------------------------------- start error test
[19-Nov-2019 10:30:28 Australia/Melbourne] PHP Notice:  Undefined variable: NotDefined in /PATH/errorTest.php on line 8
[19-Nov-2019 10:30:28 Australia/Melbourne]
[19-Nov-2019 10:30:28 Australia/Melbourne] end

我做错了什么? 为什么一台服务器记录到php错误日志,而另一台服务器记录到apache错误日志?

这很烦人,因为所有 php 错误日志消息都到处都是,而不是像升级到 php7.3 之前那样在一个日志文件中

请帮忙,谢谢。

【问题讨论】:

在您发布的脚本中,您初始化$NotDefined? @AlbertoSinigaglia 这篇文章/问题的全部要点,我需要提出一个错误来让它记录...... 您收到一个错误,因为 error_log 作为第一个参数需要一个字符串,并且您向他传递了一个从未初始化过的变量,所以它是一个未定义的变量...您想用 error_log 做什么($未定义)? 我知道!我想要一个错误!我需要弄清楚为什么 PHP 错误在生产和开发服务器上的显示方式不同。在生产中,它们最终出现在 apache 错误日志中,而在开发服务器上,它们最终出现在 php 错误日志中! 在你的 php.ini 上你应该有这个 error_log = /var/log/php-scripts.log 告诉 error_log 函数将日志放在哪里 【参考方案1】:

我尝试了各种 PHP 版本(7.2、7.3、7.4),但无法重现。

我怀疑存在写访问权限问题:

默认情况下/var/log归root所有,普通用户不可写,如apache /var/log/php 可以由任何用户(root ?)创建,如果在 httpd 服务创建此文件之前运行了任何 PHP 脚本

这可以通过运行和跟踪 httpd 调试进程来检查

# service httpd stop
# strace httpd -X

还有

# ls -al /var/log
# ls -al /var/log/php

允许普通用户登录 /var/log 似乎是一种不好的做法(安全 PoV)。

而且更改 php.ini 是一种非常糟糕的做法,尤其是在这种情况下,每个用户都需要不同的设置。

阅读How to change configuration settings

我推荐:

为日志创建一个“apache”拥有的目录

# mkdir /var/log/apache
# chown apache  /var/log/apache

并配置httpd服务使用它,在每个vhost配置文件中

php_admin_value error_log /var/log/apache/vhostname_php_error.log

我还建议不要更改 RPM 默认提供的配置文件,而是创建自己的特定文件

/etc/php.d/foo.ini /etc/httpd/conf.d/bar.conf 等

附注当 PHP 无法打开由 error_log 指令配置的文件时,默认 SAPI 日志记录的回退是 PHP 的标准行为。

【讨论】:

以上是关于2 台相同服务器上的 PHP 错误:一个记录到 php 错误日志,另一个记录 apache 错误日志的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的错误:相同的 PHP 代码但在 mac 和 windows 机器上的结果不同

php网站部署两套代码在两台服务器上面,如何做到上传文件同步

PHP共享内存详解

本地慢 PHP 项目,使用 CI 和 Xamp

服务器上的 Apache2 php 解析错误,但不是本地机器,7.2.3 到 7.2.4 问题?

两台服务器中的PHP相同时区不同分钟