php中session機制探究_PHP教程

來源:互聯網
上載者:User
1、php中session的產生機制

我們先來分析一下PHP中是怎麼產生一個session的。設計出session的目的是保持每一個使用者的各種狀態來彌補HTTP協議的不足(無狀態)。我們現在有一個疑問,我們都知道session是儲存在伺服器的,既然它用於保持每一個使用者的狀態那它利用什麼來區別使用者的呢?這個時候就得藉助cookie了。當我們在代碼中調用session_start();時,PHP會同時往SESSION的存放目錄(預設為/tmp/)和用戶端的cookie目錄各產生一個檔案。session檔案名稱像這樣:

格式為sess_{SESSIONID} ,這時session檔案中沒有任何內容,當我們在session_start();添加了這兩行代碼:

$_SESSION['name'] = 'wanchun0222';

$_SESSION['blog'] = 'coderbolg.com';

這時檔案就有內容了:

name|s:11:"wanchun0222";blog|s:13:"coderbolg.com";

這時再看看cookie:

可以看到伺服器為我們自動產生了一個cookie,cookie名稱為"PHPSESSID",cookie內容是一串字元,其實這串字元就是{SESSIONID}。也許你已經明白了,當我們使用session時,PHP就先產生一個唯一的SESSIONID號(如2bd170b3f86523f1b1b60b55ffde0f66),再在我們伺服器的預設目錄下產生一個檔案,檔案名稱為sess_{SESSIONID},同時在目前使用者的用戶端產生一個cookie,內容已經說過了。這樣PHP會為每一個使用者產生一個SESSIONID,也就是說一個使用者一個session檔案。PHP第一次為某個使用者使用session時就向用戶端寫入了cookie,當這個使用者以後訪問時,瀏覽器會帶上這個cookie,PHP在拿到cookie後就讀出裡面的SESSIONID,拿著這個SESSIONID去session目錄下找session檔案。找到後在調用$_SESSION['blog']的時候顯示出來。

2、php中session的到期回收機制

我們明白了session的產生及工作原理,發現在session目錄下會有許多session檔案。當然這些檔案一定不是永遠存在的,PHP一定提供了一種到期回收機制。在php.ini中session.gc_maxlifetime為session設定了存留時間(預設為1440s)。如果session檔案的最後更新時間到現在超過了存留時間,這個session檔案就被認為是到期的了。在下一次session回收的

時候就會被刪除。那下一次session回收是在什麼時候呢?這和php請求次數有關的。在PHP內部機制中,當php被請求了N次後就會有一次觸發回收機制。到底是請求多少次觸發一次是通過以下兩個參數控制的:

session.gc_probability = 1

session.gc_divisor = 100

這是php.ini的預設設定,意思是每100次PHP請求就有一次回收發生。機率是gc_probability/gc_divisor 。我們瞭解了伺服器端的session到期機制,再來看看用戶端的cookie的到期機制。

如果cookie失效了瀏覽器自然發送不了cookie到伺服器,這時即使伺服器的session檔案存在也沒用,因為PHP不知道要讀取哪個session檔案。我們知道PHP的cookie到期時間是在建立時設定的,那麼PHP在建立session的同時為用戶端建立的cookie的生命週期是多久呢?這個在php.ini中有設定:session.cookie_lifetime 。這個值預設是0,代表瀏覽器一關閉SESSIONID就失效。那就是說我們把session.gc_maxlifetime和session.cookie_lifetime設定成同一個值就可以控制session的失效時間了。

3、php中session的用戶端儲存機制

由上面的介紹我們可以知道,如果使用者關閉了cookie,那我們的session就完全沒法工作了。是的,確實是這樣。php中session的用戶端儲存機制只有cookie嗎?不是的。既然我們的SESSIONID 不能通過cookie傳遞到各個頁面,那我們還有另一個法寶,就是通過頁面GET傳值的方式。

PHP可以在cookie被禁用時自動通過GET方式跨頁傳遞SESSIONID,前提是設定php.ini的session.use_trans_sid為1。這時當我們在用戶端禁用了cookie時使用了session,並在當前頁面通過點選連結到另一頁面時,PHP會自動在連結上添加SESSIONID參數,像這樣:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你應該看到了這種方式的缺點:好像不夠安全啊。

:轉載自:藍色夏威夷

http://www.bkjia.com/PHPjc/478552.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478552.htmlTechArticle1、php中session的產生機制 我們先來分析一下PHP中是怎麼產生一個session的。設計出session的目的是保持每一個使用者的各種狀態來彌補HTTP協議的...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.