php - PHP 类析构函数是否总是在 Apache HTTP 请求线程上下文中调用?

标签 php

我有一个 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/

相关文章:

php - 如何在 PostgreSQL 9.1 中使用 pgFouine?

php - 单独的用户 Controller 和注册 Controller 还是将两者结合起来?

php - mysql like %asd% 相当于 solr 查询

php - 如何在 phpMyAdmin 中填充数据库的多个表

php - Symfony solr bundle 2.8 +

php - 通知 : Undefined offset: 2 in wysiwyg's ckeditor. 公司

PHP UNIX 时间戳不迭代到相同的值

php - SQL 更新 - 如何切换?

php - ExtJS 4 中多个同时运行的 ajax 请求

php - 在 PHP/MySQL 中比较两个电子邮件地址总是返回 false