我注意到使用__destruct
在PHP 5.3中使用Zend_Session_Namespace
写入数据时出现了一些意外的行为:
public function __destruct(){
$this->getSession()->data = $this->data;
}
// ....
private function getSession()
{
if (! self::$zendSession) {
// this next line is fine because the object is a singleton
self::$zendSession = new Zend_Session_Namespace(self::SESSION_NAMESPACE);
}
return(self::$zendSession);
}
析构函数被调用,但数据没有被写入。但是,如果我在对象已经完成所有必要的操作后隐式调用destruct,并在脚本终止之前强制销毁,那么数据写得很好,但我宁愿不这样做。
我想它与这个bug有关:http://bugs.php.net/29032(bug对我来说有点老了),从表面来看,修复看起来很好(将__destruct注册为关闭函数,这是在$_SESSION
不可用之前调用,但是析构函数不会被调用两次(一次通过register_shutdown_function
并且一次自动调用?
当然,在关机时将奇数位的对象数据写入会话是一件已经解决的问题?如果需要,人们会怎么做?
(OSX 10.6.6,Apache 2.2.15(Unix),PHP 5.3.3,Zend Framework 1.7.2)
答案 0 :(得分:2)
这是鸡和蛋的问题。如果会话终止直到所有对象都被销毁,那么就不可能将对象用于会话保存处理程序。
register_shutdown_function
解决方法很好。为避免运行代码两次,您应将会话终止代码移动到您注册的其他函数中。在一个仍然存在的对象上手动调用__destruct()似乎有点难看;)