无法在 PHP 和 ini_set 中设置 error_log 选项

Can not set error_log option in PHP with ini_set

我在 Ubuntu Xenial 上 运行 PHP 7,在使用 WordPress 时遇到了一个奇怪的情况。我试图启用 WP_DEBUG_LOG 但它没有写入调试日志文件。

我写了一个小测试用例,但我不明白为什么会这样。我没有更改 safe_modeopen_basedir 的默认配置,我的谷歌搜索让我相信这将是罪魁祸首。

脚本

<?php
header('Content-Type: text/plain');
define('DEBUG_LOG', '/www/wp-content/debug.log');

echo "PHP Version: " . phpversion() . "\n";
echo "PHP SAPI: " . php_sapi_name() . "\n";

echo "safe_mode: "; var_dump(ini_get('safe_mode'));
echo "open_basedir: "; var_dump(ini_get('open_basedir'));
echo "error_log: "; var_dump(ini_get('error_log'));

echo "Permissions: " . substr(sprintf('%o', fileperms(DEBUG_LOG)), -4) . "\n";
file_put_contents(DEBUG_LOG, "Direct Write\n", FILE_APPEND);

echo "Setting log_errors: "; var_dump(ini_set('log_errors', true));
echo "Setting error_log: "; var_dump(ini_set('error_log', DEBUG_LOG));

error_log('Testing error_log');

die(file_get_contents(DEBUG_LOG));

输出

PHP Version: 7.2.5-1+ubuntu16.04.1+deb.sury.org+1
PHP SAPI: fpm-fcgi
safe_mode: bool(false)
open_basedir: string(0) ""
error_log: string(22) "/var/log/php_error.log"
Permissions: 0777
Setting log_errors: string(1) "1"
Setting error_log: bool(false)
Direct Write

直接写 file_put_contents 有效,但 error_log 无效,显然是因为调用 ini_set('error_log') returns false.

还有什么其他原因会导致这种情况?

编辑:6 月 4 日星期一 16:40:35 CDT 2018

感谢这里的评论,我发现在我的 PHP-FPM 配置中使用了 php_admin_value,这使得设置不可变。

Any directive type set with php_admin_value can not be overridden by .htaccess or ini_set().

http://php.net/manual/en/configuration.changes.php

ini_set() 全局有效,但并非所有设置都有效

ini_set() 适用于 php.ini 中的全局设置。某些服务器设置为在 HOST 或 PATH 设置下设置值。 ini_set() 无法更改这些特定值。