有時候,奇怪的問題,來自奇怪的地方。往往必須仔細留意流程每一個環節,否則常常流於 trial and error 的形式。
如果你購買了一個支援PHP的網頁空間/虛擬主機,
然後在你的 PHP Script 裡用到了 session,
有時,你會希望 session 的 lifetime 是你所預期的某個時間長短,也許是三個小時,也許是五個小時,也許是一天,也許是一個月。
你想了又想,然後想到了 ‘session.cookie_lifetime’ 這個在 php.ini 裡的參數。
但是因為你碰不到 php.ini ,所以你在你的 script 裡用 ini_set() 設定了你想要的時間。
然後經過測試…..(簡單的來說,就是漫長的等待) 發現 …. 無效!
你可能會回頭看看相關的 session 設定,然後用 phpinfo() 看了在主機上的設定,甚至把 gc_maxlifetime 調大:
ini_set(‘session.gc_maxlifetime’,86400);
但是,常常怎麼設定都沒有用,你的 Session 還是會莫名奇妙地提早 expire了。
那麼,你要注意了:(因為這是我的血淚史)
PHP的 session 預設是放在 /tmp 下的,就算在虛擬主機上也一樣,大家都放在一起。就算你的 session.gc_maxlifetime 設很大,但是只要有人的 session.gc_maxlifetime 設定比你小的話, PHP 在 garbage cleanup 時可不會去判別是哪個 script or 哪個 user 的 session,PHP 會一視同仁地清清清,所以你再怎麼設定都沒用。
解決辦法:
把 session 放到自己的目錄下。
就這麼簡單。
設定方法:
- 在自己 script 的目錄下建個 tmp (or session) 的目錄
- 把 tmp (or session)目錄權限改成 777 (或是 webserver user 可讀寫的權限)
- 在你的 PHP script裡加入一行:
- 或是在 .htaccess 裡加上這一行
ini_set(‘session.save_path’,$_SERVER[‘DOCUMENT_ROOT’] .’/tmp/’);
php_value session.save_path [你的session save_path]
之後….就再進行一次漫長的等待測試吧,應該是沒問題啦 🙂
真是不賴的分享,不過…看得到你的血淚啊! XD
讚呀,這個問題正困擾我已久。
感謝分享^___^
謝謝您的分享,很有用!!
謝謝分享剛好有這方面想知道
請問一下,session lifetime 存活時間加長可用在什麼地方?
我剛剛試了一下, session 的值好像還是會被清空?
抱歉,在自己的主機上測試結果是 session 值還存在。
謝謝你的分享 !!!
HI 請問一下”你的session”是啥意思啊?