虛擬主機上的 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]

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

Ken Lee 發表迴響 取消回覆

你的電子郵件位址並不會被公開。 必要欄位標記為 *

%d 位部落客按了讚: