命令行界面 - PHP CLI 不会记录错误


command line interface - PHP CLI won't log errors

PHP 目前不会记录从命令行生成的错误。

我有:

log_errors = On
error_log = /var/log/php_errors.log

在文件/etc/php5/cli/php.ini 中。

我是否缺少进一步的设置来使其正常工作?

请检查运行 PHP CLI 的用户帐户是否具有对/var/log/php_errors.log的写入访问权限。

此外,您可以验证是否使用了正确的 php.ini 文件,如下所示:

php -a -c /etc/php5/cli/php.ini

在 Ubuntu 12.04(精确穿山甲(环境中设置 PHP CLI 日志记录时,这个问答线程对我非常有帮助,所以我想发布一个提炼我所学的答案。除了David Chan和George Cummins提供的大量信息之外,我还创建了一个logrotate.d脚本来确保PHP CLI错误日志不会失控,并进行设置,以便多个用户能够将错误记录到常见的PHP CLI错误日志中。

首先,PHP CLI 的默认行为是将错误消息记录到标准输出;记录到文件不是默认行为。这通常意味着记录到运行 PHP CLI 命令的同一命令行终端会话。虽然 PHP ini 文件确实为指定的error_log提供了便利,但需要做出额外的调整才能真正使其工作。

首先,我必须创建一个初始php_errors.log文件:

sudo touch /var/log/php_errors.log

由于有问题的服务器由从事各种项目的 Web 开发人员使用,因此我为他们设置了一个名为 www-users 的公共组。在这种情况下,我希望php_errors.log可读和可写www-users我像这样更改文件的所有权:

sudo chown root:www-users /var/log/php_errors.log

然后将文件的权限更改为:

sudo chmod 664 /var/log/php_errors.log

是的,从安全的角度来看,让www-users中的任何人都可以读取和写入日志文件并不是那么好。但这是一个受控的共享工作环境。所以我相信用户会尊重这样的事情。此外,当PHP从CLI运行时,任何可以做到这一点的用户都需要对日志的写入访问权限才能写入日志。

接下来,进入/etc/php5/cli/php.ini以调整默认的 Ubuntu 12.04 设置以匹配此新日志文件:

sudo nano /etc/php5/cli/php.ini

令人高兴的是,log_errors在 Ubuntu 12.04 中默认启用:

log_errors = On

但是要允许记录到文件,我们需要更改error_log以匹配新文件,如下所示:

error_log = /var/log/php_errors.log

设置logrotate.d脚本。

现在应该是这样,但是由于我不希望日志失控,因此我为php_errors.log设置了一个logrotate.d。在/etc/logrotate.d/中创建一个名为 php-cli 的文件,如下所示:

sudo nano /etc/logrotate.d/php-cli

并将此日志旋转守护程序脚本的内容放在那里:

/var/log/php_errors.log {
        weekly
        missingok
        rotate 13
        compress
        delaycompress
        copytruncate
        notifempty
        create 664 root www-users
        sharedscripts
}

测试设置。

完成此操作后,让我们使用David Chan的提示测试设置:

php -r "error_log('This is an error test that we hope works.');"

如果运行正确,您应该被反弹回空的命令提示符,因为 PHP CLI 错误不再发送到标准输出。因此,请检查测试错误消息的实际php_errors.log,如下所示:

tail -n 10 /var/log/php_errors.log

那里应该有一个带时间戳的错误行,看起来像这样:

[23-Jul-2014 16:04:56 UTC] This is an error test that we hope works.

作为诊断,您可以尝试通过以下方式强制写入错误日志:

php -c /etc/php5/cli/php.ini -r " error_log('test 123'); "

现在,您应该在日志中看到测试 123:

tail /var/log/php_errors.log

PHP 的日志记录/报告行为也取决于error_reporting。

某些 PHP 框架(例如 CodeIgniter(在生产模式下执行 error_reporting(E_STRICT) 语句或等效语句,这将大大减少记录的错误数量/类型。

如果你想调试一些东西,那么你可以在代码之前放以下语句:

error_reporting(E_ALL);

如果您无法弄清楚为什么或可能对文件 php.ini 没有用户权限,那么调试无信息解析错误的另一种方法是将您的 PHP 源代码包装在另一个 PHP 源代码文件中,其正文如下:

ini_set('display_errors', 1);
error_reporting(E_ALL);
include "mybustedfile.php";

在 PHP 文件中

error_log("You messed up!", 3, "/var/tmp/my-errors.log");

在终端中

tail -f /var/tmp/my-errors.log

输出

你搞砸了!