虛擬主機上的 session lifetime

有時候,奇怪的問題,來自奇怪的地方。往往必須仔細留意流程每一個環節,否則常常流於 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裡加入一行:
  • ini_set(‘session.save_path’,$_SERVER['DOCUMENT_ROOT'] .’/tmp/’);

  • 或是在 .htaccess 裡加上這一行
  • php_value session.save_path [你的session save_path]

之後….就再進行一次漫長的等待測試吧,應該是沒問題啦 :)

延伸閱讀

文章資訊

 

9 Responses to 虛擬主機上的 session lifetime

  1. jimmy says:

    真是不賴的分享,不過…看得到你的血淚啊! XD

  2. peko says:

    讚呀,這個問題正困擾我已久。
    感謝分享^___^

  3. Richard Chen says:

    謝謝您的分享,很有用!!

  4. 謝謝分享剛好有這方面想知道

  5. Pingback: EnHung’s Blog » 虛擬主機上的 session lifetime

  6. jocosn says:

    請問一下,session lifetime 存活時間加長可用在什麼地方?
    我剛剛試了一下, session 的值好像還是會被清空?

  7. jocosn says:

    抱歉,在自己的主機上測試結果是 session 值還存在。

  8. Pingback: 野貓的零碎生活片段

  9. Ken Lee says:

    謝謝你的分享 !!!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>