在我多年来的第一个PHP脚本中,我试图记录一个错误:
error_log("my error message", 3, $error_log);
我在一般的Apache错误日志中收到错误:
PHP 警告:error_log(/var/log/apache2/my_php_errors.log):无法打开流:第 88 行的/var/www/html/blahblah/my_script.php 中的权限被拒绝
这是我检查并尝试过的:
- 创建的
$error_log
具有与 Apache 错误日志相同的所有权 (root.adm
) 和权限 (640
)。 - 将所有者更改为
www-data
,这是运行 PHP 的用户。 -
log_errors
On
. -
open_basedir
未设置。 - 使用 PHP 5.5.x,因此不存在安全模式。
我错过了什么?
编辑:它能够写入一般的Apache错误日志。 谜团在于为什么它不能写入具有相同所有权和权限的同一目录中的另一个文件。
编辑 2:另一位开发人员告诉我,这适用于他的 WAMP,因此它是特定于我的 LAMP 堆栈或配置的东西。
我遇到了同样的问题。https://serverfault.com/questions/831444/php-error-log-per-vhost/831666#831666
touch /path/to/php_error.log
chown www-data:www-data php_error.log
chmod 755 php_error.log
感谢您引导我找到答案!
TL;DR:检查所有祖先目录是否允许 Web 服务器读取/列表。
在我的系统上,我的等效/var/log/apache2/my_php_errors.log
给出了同样的错误。 我最终在路径的每个级别(/
,/var/
,/var/log/
,/var/log/apache2/
,/var/log/apache2/my_php_errors.log
)进行了ls -ld
。
其中四个具有使其可被 Web 服务器读取的权限。 其中之一,/var/log/apache2/
没有。 当我将文件移出apache2
目录时,一切开始正常工作。 例如 /var/log/php/
并在新目录上设置适当的权限/所有权(例如 www-data.adm 的 750)。
prompt> ls -ld /var/log/php/
drwxr-x--- 2 www-data adm 4096 Nov 1 13:31 /var/log/php/
您也可以更改/var/log/apache2/
的权限,但这似乎是一个安全/隐私问题。 创建一个新目录并保留现有结构更安全。
必须更改权限的原因是它不再使用某些版本的syslog
发布到日志文件。 syslog
变体以 root 身份运行并接受来自非 root 的消息。 但就我而言,我从 Web 服务器指定文件,这使得权限错误。
有一个修复程序使用syslog
,以便它可以保持相同的所有权。 我没有尝试这样做,因为这适用于测试服务器。
这可能不是您遇到的问题,但我很确定我使用的是/var/log/apache2/
的默认权限。 所以很可能是问题所在。 即使不是,这也是我正在寻找故障排除建议的地方之一。 所以下次这样的事情发生在我身上时,我会提醒要检查什么。