PHP 設定 session 的過期時間

現在的網站都流行登入後, 除非按了登出, 不然就永遠是登入狀態(永不過期).(註: 相對需要更注意使用者帳號的安全問題)

不過, 這樣子設的話, 計算 目前站上人數 就得要另外想辦法做囉~ :)

Session 過期時間參數

設定過期時間參數, 主要是設定 session.gc_maxlifetime 的參數即可, 再保險一點的設定, 就設定下面這兩個參數.

  • ini_set('session.cookie_lifetime', 0); // 可用 print_r(session_get_cookie_params()); 觀察
  • ini_set('session.gc_maxlifetime', 3600); // 可用 echo ini_get("session.gc_maxlifetime"); 觀察

session_cookie_lifetime 設為 0 的話, 代表等到 browser 才把此 cookie 清掉.(session 和 browser cookie 是有相關的)

如果懶得想這些, 直接用下面的 function 就可以了~ :P

Session 過期時間程式

下述程式轉載自: Cross-Browser Session Starter


<?php
function start_session($expire = 0)
{
    if ($expire == 0) {
        $expire = ini_get('session.gc_maxlifetime');
    } else {
        ini_set('session.gc_maxlifetime', $expire);
    }

    if (empty($_COOKIE['PHPSESSID'])) {
        session_set_cookie_params($expire);
        session_start();
    } else {
        session_start();
        setcookie('PHPSESSID', session_id(), time() + $expire);
    }
}
?>

使用方式

  • 於程式最上方加入: start_session(600); // 代表 600 秒後會過期 (取代原本 session_start())

如果要再延長過期時間, 只要再做修改即可.

但是有個問題要注意, 就是 PHP 的 session 預設是存成 file, 所以 /tmp 可能會因這樣設定而爆掉(檔案太多), 通常解法是把 session 存進 DB/memcache 中.



This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

PHP 設定 session 的過期時間 有 9 則回應

  1. ironman 說道:

    Tsung大
    小弟在PHP還是生手
    可否請問
    小弟是租用美國iPower的主機
    在主機的php.ini看是顯示1440秒
    session.gc_maxlifetime = 1440
    不過我每次登入網站後
    沒多久就被登出了
    明明登入沒有幾分鐘
    回來後就被登出了
    而且時間都不同
    有時幾分鐘
    有時十幾分鐘
    感覺真的很不方便
    真不曉得為何會這樣
    是Server或程式有問題嗎
    小弟也有在小舖發問
    但還是無法解決
    這是測試網址:
    http://www.paohuang.com.tw/SessionTest/Login.php
    這是小弟發問的網址
    http://www.blueshop.com.tw/board/show.asp?subcde=BRD20090901231637FHU&fumcde=FUM20041006152627A9N
    可否請求Tsung大指點
    感激不盡
    謝謝

  2. ironman 說道:

    目前有在session.save_path 指定的/tmp
    放一個tmp的資料夾
    並將權限都設為777
    已有看到一些sess_c70bf812117ed305f2200561b6b5f6bd的檔案出現
    這樣不知正不正確
    謝謝

  3. Tsung 說道:

    您要不要試試把我上面那個 function 拿去用.
    session_start() 就改成 start_session(600); 這樣子看看, 看看是不是 600秒後會登出? :)

  4. 阿任 說道:

    感覺您真有心
    搜尋很多教學文都會找到您的網站
    因為印象真的很深刻..
    好像很少人把自己的大頭貼拿來當shortcut icon的圖案= =
    總之
    感謝分享!

  5. Tsung 說道:

    哈, 因為.... 我懶阿.
    我也想要找其他的, 但是好累喔.. Orz..

  6. esam 說道:

    請問我用上面的function去設定登入時間,在本機如果設定24小時大約會少8小時,放到線上主機則縮短至1小時左右會被登出,這大概會是哪一方面的問題?
    本機環境是AppServ 線上主機是獨立安裝,謝謝

  7. 端茶小弟 說道:

    你好,我是做整合行銷的團隊,本身也是程式設計師,多次搜尋到你的文章~覺的你覺的不錯!有沒有興趣接案子~或是合作,沒興趣交個朋友也OK的!請加我的skype吧!johnnickkimo

發表迴響

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


九 + 6 =

你可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>