PHP 內建的 session 方法

簡單快速。

簡述

在實作登入功能時需要用到 session 機制來處理 HTTP 的無狀態問題。第一種方法是自己開一個資料庫來建立 token 機制,第二種方法是用 PHP 提供的內建方法,後者會更方便一點。

關於手做 token 的方式可以參考這篇:當 Cookie 被竄改會怎麼樣?

使用方式

這裡簡單寫個程式碼,腦袋有個畫面就好。

備註:每次要用 session 的功能都要記得先 session_start() 才不會出錯。

1
2
3
4
5
6
7
8
9
// pageA.php
<?php
// 建立一個 session
session_start();
// 設定要儲存的 key 與 value
$_SESSION['username'] = 'PeaNu';
?>
// 到頁面 B 的網址
<a href="./pageB.php">到頁面 B</a>

接著到頁面 B 就可以取得在 頁面 A 儲存的 session:

1
2
3
4
5
// pageB.php
<?php
session_start();
echo $_SESSION['username']; // 'PeaNu'
?>

如果要刪除 session 可以這樣子:

1
2
3
4
5
6
7
// delete_session.php
<?php
session_start();
// 刪除 session
session_destroy();
header("Location: ./pageB.php");
?>

這時候頁面 B 就存不到 $_SESSION['username'] 的值了。

原理簡述

其實背後的原理一樣是透過 cookie,只是內建的方法會在你的電腦裡建立一個 session 檔案,把要儲存的內容寫在裡面。

附註:精確一點來說是存在記憶體,所以電腦關機後就會消失了。

session;

在 xampp 底下有個 tmp 的資料夾:可以在裏頭找到對應的 session 檔案:

1
2
3
4
5
6
7
8
9
───tmp
├───ibE87C
├───ibE87D
├───ibE87E
├───ibE88F
├───sess_8oadq07ei2b8g25muckbpfjs8n
├───sess_924h1hulv8fmfqkao4bj05249u => 就是它囉!
├───sess_gukpo79ueg96nfld2mj5jo2sql
├───why

把它打開就會看到內容:

1
username|s:5:"peanu";

補一下以前沒有講清楚的地方。

雖然我上面說 session 是在你的電腦裡建立一個檔案來儲存,但要注意這句話是建立在「你的電腦屬於 Server 端」的情況下才成立。

再重申一次:

  1. Client 端儲存的是 session_id:924h1hulv8fmfqkao4bj05249u
  2. Server 端儲存的是 session_id 對應到的值:username:"peanu"

所以,今天你到一個有 session 機制的網頁,會儲存在你電腦裡的是 session_id(透過 cookie 保存),不是 username:"peanu",真正的資料是儲存在 Server 那邊的,不是 client,不要搞錯了。

另外要補充的是,在執行 session_destroy() 時,會把 tmp 儲存的 session 資料給刪除,這時候 $_SESSION 就讀不到任何資料,雖然 application 裡還是會保留 PHPSESSID 這個 cookie。

mentor-program-day56 PHP 在 function 中存取全域變數
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×