【问题标题】:PHP CLI won't log errorsPHP CLI 不会记录错误
【发布时间】:2011-09-17 06:27:52
【问题描述】:

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

我有:

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

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

我是否缺少其他设置来使其正常工作?

【问题讨论】:

  • 对我来说,在 centos 上,使用来自 remi repo 的 php7.0,问题在于配置中的 error_log = php_errors.logerror_log = /var/log/php_errors.log 是解决方案。

标签: php command-line-interface error-logging


【解决方案1】:

Ubuntu 12.04(Precise Pangolin)环境中设置 PHP CLI 日志记录时,这个问答线程对我非常有帮助,所以我想发布一个回答,以提炼我所学到的知识。除了 provided by David Chanas 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 中的任何人都可以读写日志文件并不是那么好。但这是一个受控的共享工作环境。所以我相信用户会尊重这样的事情。此外,当从 CLI 运行 PHP 时,任何可以执行此操作的用户都需要对日志进行写访问,甚至可以写入日志。

接下来,进入/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’s tip 测试设置:

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.

【讨论】:

  • 这个答案结合了正在发生的事情的上下文,建议特定的配置更改以及如何进行更改,通过日志轮换巩固日志记录并测试配置。其中一些是受到其他 cmets 的启发,但它被完美地包裹在一个地方。谢谢@JakeGould。
【解决方案2】:

在 PHP 文件中

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

在终端中

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

输出

你搞砸了!

【讨论】:

  • 这如何回答这个问题?
  • /var/tmp 属于我所在系统上的用户 root (Ubuntu MATE 20.04 (Focal Fossa))。
【解决方案3】:

如果您不知道原因是什么,或者可能没有文件 php.ini 的用户权限,那么调试无信息解析错误的另一种方法是将您的 PHP 源代码包装在另一个 PHP 源文件,其主体类似于:

ini_set('display_errors', 1);
error_reporting(E_ALL);

include "mybustedfile.php";

【讨论】:

    【解决方案4】:

    PHP 的日志记录/报告行为也依赖于 error_reporting。

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

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

    error_reporting(E_ALL);
    

    【讨论】:

      【解决方案5】:

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

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

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

      tail /var/log/php_errors.log
      

      【讨论】:

        【解决方案6】:

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

        此外,您可以像这样验证您使用的是正确的 php.ini 文件:

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

        【讨论】:

        • 如果我运行该命令时没有任何反应,这是否意味着 CLI 没有使用该 php.ini 文件?
        • 我不确定您所说的“什么都没有发生”是什么意思,但是您可以通过使用 phpinfo() 并搜索“加载的配置文件”来确定您正在使用的配置文件
        • 另外,记得使用-a,这是我在原帖中遗漏的(现已修复)。
        • 我的意思是字面意思;一定是因为缺少-a。因此,如果它使用了正确的配置文件,但仍然没有将任何内容写入日志,那该怎么办?
        • 从几个不同的来源阅读并在本地进行测试后,我开始偷偷怀疑 PHP CLI 不使用日志文件,无论指令如何。相反,它只将输出发送到 stderr。您可以像这样强制解决问题:$php -a >> /var/log/php_errors.log 2>&1。这能满足您的需要吗?
        猜你喜欢
        • 1970-01-01
        • 2012-01-02
        • 2018-08-28
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 2018-06-26
        相关资源
        最近更新 更多