用户
 找回密码
 入住 CI 中国社区
搜索
楼主: v阿杰
收起左侧

[版本 3.x] SESSION 使用出错

[复制链接]
发表于 2015-4-22 09:20:55 | 显示全部楼层
你的開發環境是?Windwos / Linux?
发表于 2015-4-22 10:11:44 | 显示全部楼层
估計是判斷PHP環境出錯,執行環境應該是版本5.4以下,但不知因何原因判為5.4或以上。也許是執行環境的PHP版本號不按規定。

可参考PHP手冊中的version_compare()函數。
 楼主| 发表于 2015-4-22 10:22:47 | 显示全部楼层
燃雲 发表于 2015-4-22 10:11
估計是判斷PHP環境出錯,執行環境應該是版本5.4以下,但不知因何原因判為5.4或以上。也許是執行環境的PHP版 ...

的确是5.4以上的php

发表于 2015-4-22 13:49:04 | 显示全部楼层
參考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功能看看是否如此。
 楼主| 发表于 2015-4-22 14:50:05 | 显示全部楼层
本帖最后由 v阿杰 于 2015-4-22 14:53 编辑
燃雲 发表于 2015-4-22 13:49
參考CodeIgnter 3.0.0 system/libraries/Session/session.php源碼

环境设置有关吧!
5.4.0RC4版本的

现在换成5.4.40没提示了!
FCPATH.'public/sess_save_path';
必须要绝对路径,
相对路径有警告
发表于 2015-7-20 18:40:34 | 显示全部楼层
我也遇到这个问题,什么解决?
发表于 2015-8-16 13:59:46 | 显示全部楼层
大概是在哪些文件中修改什么?
发表于 2015-11-21 11:36:52 | 显示全部楼层

阅读手册也没找到原因,自动加载session就是出错。
发表于 2015-11-21 11:56:09 | 显示全部楼层
把session.php的107行注释了
PHP复制代码
 
                        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')
                                );
 
                                register_shutdown_function('session_write_close');
                        }
 
 
复制代码
发表于 2015-12-14 14:15:51 | 显示全部楼层
我正在用一个codeignitor 3.0写的erp的软件eacherp, http://www.Eacherp.net ,也碰到这个问题,后来

把config文件中改为如下就正常了:
$config['sess_save_path'] = 'C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\eacherp\session_dir'

其实ci的config文件中已经注明:“使用文件方式保存session,必须使用绝对路径”。

本版积分规则