PHP-session案例詳解

來源:互聯網
上載者:User
這次給大家帶來PHP-session案例詳解,PHP-session使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

cookie和session是web開發新手容易搞混的兩個概念,弄清楚兩者有助於對web互動更好的理解。個人認為session和cookie的區別主要有如下幾點:

cookie

資訊儲存在用戶端

具體實現由用戶端負責

資料大小和數量一般有限制

資料容易被竊取和篡改

session

資料儲存在服務端

具體實現由伺服器負責

資料大小和數量原則上無限制

安全性較高,可信度強

狹義的session指的是web會話中的session id以及關聯的資料,廣義的session指通訊雙方的互動會話。例如使用者登入是一次session互動,在ATM機取錢是一次session互動,等等。

session的細節

session的主要作用是標識一個會話,並儲存會話期間的資料。以下是session的一些細節。

存取

PHP通過$_SESSION超全域變數擷取和存放session中的所有資料。$_SESSION是一個數組,可以方便的進行賦值和讀取,例如:

$name = $_SESSION['NAME'];  // 讀取session中的name值$_SESSION['NAME'] = 'new name';   // 賦新值unset($_SESSION['NAME']);     // 移除session中的值

到期時間

預設session中的資料有可能在session逾時後被移除,這取決於PHP是否及時運行記憶體回收。由於PHP運行記憶體回收的係數是請求數,帶來的後果是:1. 低流量的網站逾時很久後session資料也未被移除; 2. 大流量網站頻繁的進行session記憶體回收; 3. 運行記憶體回收在執行使用者請求前,遇到了運行記憶體回收的使用者可能會感受到系統延遲。一個更好的解決辦法是禁用PHP的預設記憶體回收,以cron任務定時執行session_gc函數。這樣既保證session的時效性,也能帶來效能和使用者體驗上的提升。

手動移除session中的資料可以用unset移除單個資料項目,或者session_destroy函數暴力刪除所有的資料。

儲存介質和序列化

session中的資料預設以檔案形式儲存在磁碟上,session開啟時讀取檔案內容還原序列化,然後填充$_SESSION數組。在大流量的網站中,存放session檔案的目錄下會包含大量小檔案,將對檔案系統造成沉重的IO負擔。

session模組中的handler可以指定資料儲存方式,例如存放到資料庫中、redis/memcache等介質中。PHP內建的handler包括files(預設),redis和memcache。使用者可以通過session_set_save_handler來註冊自己的handler。

session中存放的資料可能是字串等基本類型,也可能是數組、對象等複雜類型。session設定中的serialize_handler用來設定序列化和還原序列化的handler,hanlder將資料序列化後,在交給save_handler儲存。由序列化可知,resource等類型不能也不應該儲存到session中。把一個db的串連控制代碼儲存到session中,然後10分鐘後再取出來用,這樣的想法應該儘快拋掉。

session設定名稱

由於http是無狀態協議,用戶端請求時需要攜帶session id才能讓服務端區分出session。預設的標識session id的名稱是PHPSESSID,可以使用session_name來設定其他的名稱。例如為了防止攻擊者猜出後端是PHP語言的系統,可以設定session id的名稱為JSESSIONID,迷惑攻擊者。

session自動開啟

目前主流的PHP版本預設都不會自動開啟session。例如某個訪客就隨便看一下頁面就離開,如果自動開啟session,將進行一系列的初始化操作後將session id發送到用戶端,以便下次訪問時能識別出使用者。對於一次性的訪客,或者非系統的登入使用者,這些操作只會帶來額外的開銷。

session不自動開啟的劣勢是使用session前,要確保session已經開啟,否則可能取到空資料。如果重新命名了預設的session名稱,需要在session_start前調用session_name指示目前使用的session名稱。

分布式session

大流量的網站,後端提供服務的往往不止一台PHP伺服器。如果使用者的多次請求不是落在同一台伺服器上,而伺服器的session資料不共用,可能導致要求使用者重複登入的情況發生。解決這個問題的方案既可在前端請求分發做,也可在後端通過設定分布式共用session來實現。

以檔案形式儲存session資料的系統中,可以指定某個目錄為共用目錄,所有伺服器的session都儲存在該目錄下;以redis/memcache/db等方式存放session的系統中,配置串連到同一個session伺服器即可做到session共用。以session共用方式搭建的系統,前端負載平衡器可以隨意分發請求到任意伺服器上。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

PHP+ajax實現擷取新聞資料案例詳解

php curl批處理實現可控並發非同步作業案例詳解

聯繫我們

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