PHP CLI不会logging错误

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

我有 :

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

在/etc/php5/cli/php.ini中

我错过了进一步的设置来得到这个工作?

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

另外,你可以validation你正在使用正确的php.ini文件,如下所示:

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

这个问答线程在设置Ubuntu 12.04环境中的PHP CLI日志时对我非常有帮助,所以我想发布一个答案,提炼我学到的东西。 除了由David ChanGeorge Cummins提供的大量信息外,我还创build了一个logrotate.d脚本,以确保PHP CLI错误日志不会失去控制,因此可以设置多个用户将错误logging到常见的PHP CLI错误日志中。

首先,PHP CLI的默认行为是将错误消息logging到标准输出; logging到文件不是默认行为。 这通常意味着logging到运行PHP CLI命令的同一命令行terminal会话。 虽然PHP的ini文件确实有一个指定的error_log住宿需要额外的住宿,才能真正使其工作。

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

 sudo touch /var/log/php_errors.log 

由于有问题的服务器被不同项目的web开发者使用,我为他们build立了一个叫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 

是的,从安全的angular度来看, www-users的任何人都可以读写的日志文件并不是那么好。 但这是一个受控的共享工作环境。 所以我相信用户尊重这样的事情。 另外,当从CLI运行PHP时,任何可以这样做的用户都需要对日志进行写访问,以便写日志。

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

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

令人高兴的是,Ubuntu 12.04默认启用了log_errors

 log_errors = On 

但是为了允许日志logging到文件中,我们需要更改error_log以匹配新文件,如下所示:

 error_log = /var/log/php_errors.log 

设置一个logrotate.d脚本。

现在应该是这样,但是因为我不希望日志失控,所以我为php_errors.log设置了logrotate.d 。 在/etc/logrotate.d/创build一个名为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 } 

testing设置。

完成之后,让我们用上面David Chan的提示testing设置:

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

如果运行正确,您应该弹回空命令提示符,因为PHP CLI错误不再发送到标准输出。 所以检查实际的php_errors.logtesting错误消息是这样的:

 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'); " 

您现在应该在日志中看到testing123

 tail /var/log/php_errors.log 

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

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

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

 error_reporting(E_ALL); 

如果你不知道为什么或者没有php.ini的用户权限,debugging无信息parsing错误的另一种方法是把你的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"); 

在terminal

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

输出 你搞砸了!