參考CodeIgnter 3.0.0 system/libraries/Session/session.php源碼
PHP复制代码
$class = new $class($this->_config );
if ($class instanceof SessionHandlerInterface )
{
if (is_php ('5.4'))
{
session_set_save_handler($class, TRUE);
}
else
{
session_set_save_handler(
array($class, 'open'),
array($class, 'close'),
array($class, 'read'),
array($class, 'write'),
array($class, 'destroy'),
array($class, 'gc')
);
复制代码
session_set_save_handler($class, TRUE);句報錯!
執行前的檢測不單是PHP是5.4或更高,還有必須"$class instanceof SessionHandlerInterface"為真。
再参看system/libraries/Session/drivers/Session_files_driver.php中
PHP复制代码
class CI_Session_files_driver extends CI_Session_driver implements SessionHandlerInterface {
复制代码
var_dump()顯示$class是CI_Session_files_driver,完全正確!即是說,$class應該是SessionHandler!
但執行session_set_save_handler時卻認為$class並非SessionHandler!相當奇怪!
若系統中PHP的session extension無出錯,可能是session_set_save_handler使用$class內容時出錯,故此認為$class並非SessionHandler。
参看var_dump()的$class內涵,"save_path"的確相當可疑,3.0手冊指明要求絕對路徑,但var_dump()出來是相對路徑。
PHP 5.4及5.5自動加載session我剛試過,完全無問題。若非這些問題,估計是其它環境設定引致。
至於為何自動加載才見到問題,可能非自動加載時亦有,但一閃而過。可打開log功能看看是否如此。 |