0

所以我有以下问题。我有一个会话类,它应该在请求执行结束时将其数据保存到数据库中。基本上,当它被破坏时。在这种情况下,我使用单例模式。我有一个这样的析构函数:

public function __destruct()
{
    $this->_save(); // _save is public
    // exit('I can reach this point with no error');
}

但是使用该代码,我可以从 chrome 和其他浏览器获得 net::ERR_CONNECTION_RESET 。如果我注释掉析构函数并将其放在构造函数中:

register_shutdown_function(array($this, '_save'));

当我直接调用 _save 方法时,它不会返回任何异常。

一切正常。什么可能是错的,为什么?

谢谢!

4

2 回答 2

1

好的,我找到了解决方案。_save() 方法正在调用一些将数据保存到数据库的方法。但!数据库实例是 SINGLETON,因此在任何地方都没有引用,并且此时数据库对象已经被销毁。解决方案是将对数据库实例的引用保存在模型中的某处。看起来 register_shutdown_function 正在工作,因为尚未销毁任何内容。

于 2012-04-15T19:31:33.970 回答
-1

您的错误与 crome 或其他浏览器无关。

如果您查看 PHP 文档http://php.net/manual/en/language.oop5.decon.php

The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence.

A. 如果某处调用了“exit”

B. 代码中某处的致命错误

C. 如果在另一个析构函数中抛出异常

D. 如果您尝试在析构函数中处理异常

$this->_save()是一种方法,它可能以Exception一种或另一种方式调用

虽然register_shutdown_function http://php.net/manual/en/function.register-shutdown-function.php

Registers a callback to be executed after script execution finishes or exit is called

我会假设这会在脚本正确终止或不正确终止的情况下起作用

于 2012-04-14T16:21:37.370 回答