我注意到使用__destruct
在PHP 5.3編寫使用Zend_Session_Namespace
數據略有些意外的行爲寫的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);
}
析構函數獲取調用,但數據沒有得到寫入。但是,如果我在對象完成所有必要的操作並在腳本終止之前強制銷燬之後隱式地調用了破壞,則數據寫入正常,但我寧願不這樣做。
我想它與這個錯誤有關:http://bugs.php.net/29032(對我來說,這個錯誤似乎有點老),並且在它的表面上,修復看起來不錯(註冊__destruct作爲關閉功能,這在$_SESSION
之前調用是不可用的),但不會析構函數被調用兩次(一次通過register_shutdown_function
和一次自動?
當然寫對象數據的奇數位關閉會話是一件已經解決的事情?人們做什麼當這是必需的?
(OSX 10.6.6,Apache 2.2.15(Unix),PHP 5.3.3,Zend Framework 1.7.2)
還有一些涉及'zend_controller_action - > _ redirect()'的複雜問題,但我不想讓帖子太難理解。基本上,我注意到如果有一連串的請求,使用'zend_controller_action - > _ redirect()'轉發到下一個會導致析構函數退出它引用'Zend_Session_Namespace'的行。對於鏈中的最後一個請求(其中'zend_controller_action - > _ redirect()'是* not *調用,析構函數正常完成,並且數據寫入會話 – sennett 2011-02-24 09:30:03