2009-07-05 88 views
2

我必須遷移一個php4應用程序,使用session_set_save_handler()到php5。奇怪的行爲遷移會話與回調從php4到php5

在php4中一切都很好,但在php5中,回調函數無法訪問全局變量,這些變量在調用session_set_save_handler()之前設置在頁面上。

在下面的全局變量$ G1的例子不能在session_writer()訪問(這是作爲一個回調函數傳遞)

是否有此行爲的一些解釋,或者你可以給一個提示與回調遷移會議從php4到5?

這是僞代碼:

function session_writer($id,$vars) { 
    global $g1; 
    echo "g1 not defined here: ".is_object($g1); 
} 

global $g1; 
$g1 = SomeObject(); //which is the DB connection for the session writer 

session_set_save_handler($o,$c,$r,"session_writer",$d,$g); 
session_start(); 

回答

3

這在實際上documentation注意到:

自PHP 5.0.5寫入和關閉對象的處理程序破壞之後稱爲,因此不能使用對象或拋出異常。對象析構函數可以使用會話。

可以從析構函數調用session_write_close()來解決這個雞和雞蛋問題。

從本質上講,你必須調用session_write_close()從析構函數的SomeObject的,或者執行以下操作:

<?php register_shutdown_function("session_write_close"); ?> 

無論這些解決方案應該強制會話的寫作和閉幕前的所有的對象都被破壞,讓你保持原來的回調函數。

+0

謝謝,我開始掌握這裏發生的事情。 SomeObject()是我的數據庫。所以我可以重構並將DB對象的創建複製到session_writer本身,這會是最簡單的嗎? – user89021 2009-07-05 22:10:53

0

Molf的答案確定了問題。以下是一些更多信息:

session_write_close()將輸入標識符和與其關聯的數據作爲輸入。如果你要做的是微小的改變,你可能需要知道數據是由session_encode()(這是一個編碼$ _SESSION數組內容的字符串)返回的數據。標識符是session_id()返回的內容。