CI3的Session的重大改變就是默認使用了原生的Session,這符合Session類庫原本的意思,彷佛更加合理一些。整體來講,雖然設計理念不一樣,但爲了保證向後兼容性,類庫的使用方法與CI2.0的差異不是很大。linux
###Session 驅動 CI3的Session 類自帶了 4 種不一樣的驅動(或叫作存儲引擎)可供使用:redis
我以redis爲session的存儲方案session
###錯誤出現 當我將SESSION進行存儲的時候,發現跨頁面時,session會丟失。memcached
###定位錯誤日誌this
ERROR - 2015-11-04 13:29:34 --> Session: Error while trying to obtain lock for ci_session:26b7716c39e799d7c6eac1357bc3fdd676bb6979
通過代碼跟蹤,發現錯誤在這裏報出命令行
if ( ! $this->_redis->setex($lock_key, 300, time())) { log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id); return FALSE; }
####ci官方的意思是設計
attempts to obtain a lock, in case another request already has it 生成一個鎖,防止被重複使用日誌
####那麼 setex是啥列? redis官方給出的解釋 將值 value 關聯到 key ,並將 key 的生存時間設爲 seconds (以秒爲單位)。 若是 key 已經存在, SETEX 命令將覆寫舊值。code
那麼這個東西怎麼能執行失敗呢?不懂。 因此我進入命令行redis-clihtm
執行:
setex ci_session:26b7716c39e799d7c6eac1357bc3fdd676bb6979:lock 300 ddasda
報錯:
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
沒法被保存到磁盤上 網上的解決方案是: 在/etc/sysctl.conf 添加一項 'vm.overcommit_memory = 1' ,而後重啓(或者運行命令'sysctl vm.overcommit_memory=1' )使其生效。
網上查了一下,有人也遇到相似的問題,而且給出了很好的分析(詳見:http://www.linuxidc.com/Linux/2012-07/66079.htm),簡單地說:Redis在保存數據到硬盤時爲了不主進程假死,須要Fork一份主進程,而後在Fork進程內完成數據保存到硬盤的操做,若是主進程使用了4GB的內存,Fork子進程的時候須要額外的4GB,此時內存就不夠了,Fork失敗,進而數據保存硬盤也失敗了。
###最終解決方案: 再redie.conf裏,將stop-writes-on-bgsave-error配置的yes=>no