看到之前Mr_jing的session文章,受益匪淺。碰巧我也遇到了在win下session的問題。他在文章最後一個有意思的事提到了,當時我看到之後的感覺就是,太TMD(甜蜜的)緣分了。再然後我自己整了一篇比較水的日記我所理解的session_set_save_handler的執行順序機制,可還是不甘心,究竟看看linux下session到底行不行,(現在win下肯定是不行的)。
在win下測試session gc機制
先說明環境-win下phpstudy
2.php.ini配置
3、代碼開始write.php寫入session,值為目前時間戳
4、讀取session代碼
";echo 'gc_probability'.ini_get('session.gc_probability')."
";echo 'gc_divisor'.ini_get('session.gc_divisor')."
";session_start();echo ''.'Session::=>';var_dump($_SESSION);echo ''.'Cookie::=>';var_dump($_COOKIE);echo '';echo "
ReadTime".date('Y-m-d H:i:s',time()); 5、執行read.php
看到寫入時間為17:57:04
6、讀取session,可以看到讀取session的值的(上面紅橢圓圈)時間和寫入時間都一樣,都是
17:57:04,注意下面的readtime那一行是13:58:56,
好的,截至到現在,win上都沒有問題。因為即使你的session的最大存留時間(session.gc_maxlifetime)為5秒,你的gc比例為1:1,就是百分百回收。
但是注意:
gc回收是從你的session_start開始,然後執行的是open,read,然後是gc。
具體可以點這裡看關於session的執行順序。
所以即使某個session已經到期,你去讀他,還是有值的,下一次就被gc掉了。
(有些朋友可能會想,那第一次讀取有值,那判斷使用者登入與否就不準確了啊,但是真實生產環境,肯定不是單使用者,觸發session_start機制的情境很多,所以就不足為奇了。)
那麼問題來了!!
當我們不停的在win平台重新整理read.php這個頁面,session的值一直能拿到。這就奇怪了,應該被回收了啊。怎麼還能不停的拿到。理解中session gc是根據檔案的最後修改時間與目前時間和ini中設定的maxlifetime時間做對比,然後觸發回收機制。
我們來張圖
這就是奇葩所在
1、如果把這個session刪除掉,然後在直接write,發現建立時間和剛剛刪除之前的建立時間一樣。名字相同咱可以理解,但是這個時間相同是腫麼回事!windows偷懶把資源回收筒給拿回來了?我把他清空了也是這樣。
附上個gif圖(我是有多無聊~,請用ie瀏覽器開啟此圖,或者美圖秀秀,acdsee之類)
在linux下session的gc
我本地搭建的virtualbox (ubuntu下的lamp)
配置如:
然後在來個動態圖:顯示寫入session,然後查看session檔案的狀態,再然後讀取,第一次讀取,是有值的,而且兩次查看stat sess**檔案還在,我在重新整理一次之後,那麼值沒有了。也就驗證了session的流程是open read (gc) write close。請注意我第一次有值是之前開啟的,並不是讀取的write的值
寫在最後:
文章寫的有點毛糙,亂起八遭。
最後感謝各位前輩的指點,尤其是cfc4nx。
下次再寫清楚 點。。