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 Chan
和George 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.log
testing错误消息是这样的:
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
输出 你搞砸了!