在PHP中會話處理是一個很重要的概念,它允許使用者資訊在網站或應用程式的所有頁面上保持不變。以下這篇文章就來帶大家學習PHP中會話處理的基礎知識,希望對大家有幫助。
PHP中什麼是會話(session)?
會話(session)是一種在不同網頁上保留資訊的機制,用於在使用者瀏覽網站或應用程式時識別使用者。
大家一定會有這樣一個疑問:為什麼網站需要會話?在討論這個問題之前,我們需要回過頭來看看HTTP協定是如何運作的。
HTTP協定是無狀態協定,這表示伺服器無法在多個請求之間記住特定使用者。例如,當您造訪網頁時,伺服器只負責提供所要求頁面的內容。因此,當您造訪同一網站的其他頁面時,網路伺服器會分別解釋每個請求,就好像它們彼此無關。伺服器無法知道每個請求都來自同一個使用者。
下圖簡要描述了HTTP協定。
在這個過程中,如果想要顯示特定使用者的訊息,則必須在每個請求中對使用者進行身分驗證。想像每次發出請求時,都需要進行在頁面上輸入使用者名稱和密碼進行身份驗證;這樣實在太繁瑣了,根本不實用。而,會話(session)在這個時間就派上用場了。
會話(session)允許使用者跨單一網站或應用程式的不同頁面共享訊息, 因此它有助於維護狀態。這使伺服器知道所有請求都來自同一用戶,從而允許網站顯示用戶特定的資訊和首選項。
下圖描述了HTTP協定如何與會話一起使用。
PHP如何進行會話處理?
1、啟動會話
每當想要處理會話變數時,就需要確保會話已經啟動。有幾種方法可以在PHP中啟動會話。
1)、使用session_start函數
這是最常被看到的方法,其中會話由session_start函數啟動。
很重要的是,session_start在將任何輸出傳送到瀏覽器之前,必須在腳本的開頭呼叫該函數。否則,你會遇到臭名昭著的Headers are already sent錯誤。
2)、自動啟動會話
如果需要在整個應用程式中使用會話,也可以選擇自動啟動會話而不使用session_start函數。
php.ini檔案中有一個設定選項session.auto_start,允許我們為每個請求自動啟動會話。預設情況下,它設定為0,我們可以將其設定1為啟用自動啟動功能。
2、取得會話ID
伺服器為每個新會話建立一個唯一的id。如果要取得會話ID,可以使用該session_id功能,如下列程式碼段所示。
這應該給你目前的會話ID。該session_id函數很有趣,因為它也可以使用一個參數 - 一個會話ID。如果您要將系統產生的會話ID替換為您自己的會話ID,可以將其提供給session_id函數的第一個參數。
重要的是要注意,當您想要使用自訂會話ID啟動會話時,必須將session_id函數放在session_start之前呼叫。
3、建立會話變數
一旦啟動會話,$_SESSION就會使用對應的會話資訊初始化超全域陣列。預設情況下,它使用空白數組初始化,您可以使用鍵值對儲存更多資訊。
下面我們透過程式碼範例來看看如何初始化會話變數。
如上所示,我們使用session_start函數在腳本開頭啟動了一個會話;之後,初始化了幾個會話變數;最後,我們使用$_SESSION超全域存取了這些變數。
使用$_SESSION超全域將資料儲存在會話中時,它最終會儲存在會話啟動時所建立的伺服器上的對應會話檔案中。透過這種方式,會話資料在多個請求之間共用。
正如我們所討論的,會話資訊在請求之間共享,因此在一個頁面上初始化的會話變數也可以從其他頁面訪問,直到會話到期為止。通常,會話在瀏覽器關閉時到期。
4、修改和刪除會話變數
我們可以像修改常規PHP變數一樣修改或刪除先前在應用程式中建立的會話變數。
下面透過範例來看看如何修改會話變數。
在上面的腳本中,我們先檢查是否設定了$_session['count']變數。如果沒有設置,我們將設置為1,否則我們將增加1。因此,如果多次刷新此頁,可以看到計數器每次遞增一個!
另一方面,如果想要刪除會話變量,可以使用unset函數,如下面的程式碼片段所示:
#這樣,我們就無法再存取$_SESSION['logged_in_user_id']變數了。因為它已被unset函數刪除。
5、銷毀會話
在上面我們知道可以使用unset函數來刪除特定的會話變數;那麼如果要一次刪除所有與會話相關的數據,我們要怎麼辦?
其實很簡單,我們可以使用session_destroy函數。
下面我們來看看session_destroy函數是如何運作的。
說明:session_destroy函數刪除所有儲存在目前會話中的內容。因此,當儲存在磁碟上的會話資料被session_destroy函數刪除時,我們將從後續請求中看到一個空的會話變數。
附註:通常,在使用者登出時才會使用session_destroy函數
更多相關php知識,請造訪php教學!
以上是在PHP中進行會話處理(程式碼詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!