PHP中設定一個嚴格30分鐘到期Session面試題的4種答案,session4種_PHP教程

來源:互聯網
上載者:User

PHP中設定一個嚴格30分鐘到期Session面試題的4種答案,session4種


今天在我的微博上發出一個問題:

我在面試的時候, 經常會問一個問題: “如何設定一個30分鐘到期的Session?”, 大家不要覺得看似簡單, 這裡麵包含的知識挺多, 特別適合考察基本功是否紮實, 誰來回答試試? 呵呵

為什麼問這個問題呢?

1.我在stackoverflow上看到了有人討論這個問題
2.想起來我經常問這個問題, 所以~~

在這裡, 我來解答下這個題目.

第一種回答

那麼, 最常見的一種回答是: 設定Session的到期時間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 原因如下:

1. 首先, 這個PHP是用一定的機率來運行session的gc的, 也就是session.gc_probability和session.gc_divisor(介紹參看 PHP使用Session遇到的一個Permission denied Notice解決辦法), 這個預設的值分別是1和100, 也就是有1%的機會, PHP會在一個Session啟動時, 運行Session gc. 不能保證到30分鐘的時候一定會到期.

2. 那設定一個大機率的清理機會呢? 還是不妥, 為什麼? 因為PHP使用stat Session檔案的修改時間來判斷是否到期, 如果增大這個機率一來會降低效能, 二來, PHP使用”一個”檔案來儲存和一個會話相關的Session變數, 假設我5分鐘前設定了一個a=1的Session變數, 5分鐘後又設定了一個b=2的Seesion變數, 那麼這個Session檔案的修改時間為添加b時刻的時間, 那麼a就不能在30分鐘的時候, 被清理了. 另外還有下面第三個原因.

3. PHP預設的(Linux為例), 是使用/tmp 作為Session的預設儲存目錄, 並且手冊中也有如下的描述:

Note: 如果不同的指令碼具有不同的 session.gc_maxlifetime 數值但是共用了同一個地方儲存會話資料,則具有最小數值的指令碼會清理資料。此情況下,與 session.save_path 一起使用本指令。

也就是說, 如果有倆個應用都沒有指定自己獨立的save_path, 一個設定了到期時間為2分鐘(假設為A), 一個設定為30分鐘(假設為B), 那麼每次當A的Session gc啟動並執行時候, 就會同時刪除屬於應用B的Session files.

所以, 第一種答案是不”完全嚴格”正確的.

第二種答案

還有一種常見的答案是: 設定Session ID的載體, Cookie的到期時間, 也就是session.cookie_lifetime. 這種回答也是不正確的, 原因如下:

這個到期只是Cookie到期, 換個說法這點就考察Cookie和Session的區別, Session到期是伺服器到期, 而Cookie到期是用戶端(瀏覽器)來保證的, 即使你設定了Cookie到期, 這個只能保證標準瀏覽器到期的時候, 不會發送這個Cookie(包含著Session ID), 而如果通過構造請求, 還是可以使用這個Session ID的值.

第三種答案

使用memcache, redis等, okey, 這種答案是一種正確答案. 不過, 很顯然出題者肯定還會接著問你, 如果只是使用PHP呢?

第四種答案

當然, 面試不是為了難道你, 而是為了考察思考的周密性. 在這個過程中我會提示出這些陷阱, 所以一般來說, 符合題意的做法是:

1. 設定Cookie到期時間30分鐘, 並設定Session的lifetime也為30分鐘.

2. 自己為每一個Session值增加Time stamp.

3. 每次訪問之前, 判斷時間戳記.

最後, 有同學問, 為什麼要設定30分鐘的到期時間: 這個, 首先這是為了面試, 第二, 實際使用情境的話, 比如30分鐘就到期的優惠劵?

thanks :)


php session 不會到期 怎設定到期

php session本來就會到期啊(本來是會話的cookie,也就是說關閉瀏覽器,則session到期),如果要強制到期的話可以:

setcookie(session_name(),'', time() - 3600);
session_destroy();

兩者同時使用即可。

希望能夠協助到你,如果還有什麼疑問,請留言。
 

php中怎設定session到期時間,我要在代碼中設定,不在phpini裡面設定

用session_cache_expire試試

例子 1. session_cache_expire() example


/* set the cache limiter to 'private' */

session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

/* set the cache expire to 30 minutes */
session_cache_expire(30);
$cache_expire = session_cache_expire();

/* start the session */

session_start();

echo "The cache limiter is now set to $cache_limiter</ br>";
echo "The cached session pages expire after $cache_expire minutes";
?>
 

http://www.bkjia.com/PHPjc/854357.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/854357.htmlTechArticlePHP中設定一個嚴格30分鐘到期Session面試題的4種答案,session4種 今天在我的微博上發出一個問題: 我在面試的時候, 經常會問一個問題: “如何...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.