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网站部署两套代码在两台服务器上面,如何做到上传文件同步