我有一个 PHP 应用程序 (PHP 5.3),其中的日志记录是在类析构函数中完成的。
/**
* @return void
*/
public function __destruct() {
$string = ...
$file = new SplFileObject('filename', 'a');
$file->fwrite($string."\n");
}
只有一台服务器在做日志记录。 基本上,执行日志记录的代码会保存当前时间戳(请求结束)以及其他信息,例如持续时间......
奇怪的是,当我查看日志时,时间戳并不总是按时间顺序出现。我有将近2分钟的差异。例如(我的日志):
2014-05-10 14:30:00 log1
2014-05-10 14:28:00 log2 (ended 2 minutes before previous log)
2014-05-10 14:30:01 log3
2014-05-10 14:30:02 log4
当我查看 Apache 日志时,我的时间戳与 Apache 时间戳匹配(顺序除外)。
2014-05-10 14:28:00 log2
...
2014-05-10 14:30:00 log1
2014-05-10 14:30:01 log3
2014-05-10 14:30:02 log4
我能想到的唯一解释是析构函数不是由 HTTP 线程调用的,而是稍后调用的另一个线程。任何人都可以证实这一点或提供另一个(记录在案的)解释。
最佳答案
你可以很容易地测试,如果你的析构函数写入文件,通过获取 fwrite() 的返回值,就像这样
public function __destruct() {
$string = ...
$file = new SplFileObject('filename', 'a');
$number_of_bytes = $file->fwrite($string."\n");
echo "Wrote $number_of_bytes bytes to log file";
}
旁注:析构函数不应该用于新的业务逻辑,而是用于清理分配的资源。我建议您使用事件/ Hook 进行日志记录。
还有一些需要考虑的事情:PHP 手册建议不要对 session_write_close
使用析构函数。相反,他们更喜欢使用 register_shutdown_function()
。
这总是有效的:
register_shutdown_function('log');
function log() {
$string = ...
$file = new SplFileObject('filename', 'a');
$number_of_bytes = $file->fwrite($string."\n");
echo "Wrote $number_of_bytes bytes to log file";
}
关于php - PHP 类析构函数是否总是在 Apache HTTP 请求线程上下文中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23786560/