PHP Session Tracking,為什麼網站都記得我?

PHP 本身就有內建的 Session Tracking 管理機制,可以處理 cookies 所有操縱,提供不同網頁之間,或是在多個造訪期間中,持續儲存資料的存取,這樣的機制方便我們設計購物車功能,或者網站登入驗證機制。

閱讀本文後,應該就能自行架設本機 PHP 測試網站,簡單編寫 Session Tracking 程式。

建立本機開發環境非常重要,方便隨時寫個小程式測試,先讓小東西跑起來,這些小東西就是慢慢堆積起來的技術能力,就從建立開發環境開始 👍。

PHP 開發環境建立

1. 安裝 PHP

首先準備 MacBook 百寶箱 Homebrew,使用 MacBook 寫程式必要的工具,瞬間提升好幾個效率等級。

安裝 PHP:

brew install php

確定安裝成功.

php -v

2. 安裝程式碼編輯器

程式碼編輯器用得順手最重要,太多花俏的功能會影響開發效率,足夠就好。

推薦兩個還不錯的,sublime text 或是 visual studio code,喜歡簡單的開始,就選擇 sublime,sublime 的速度感覺快一點,也可以自行加上各式輔助外掛功能,但為了簡單的開始,不要弄得太複雜。

sublime text 用了一段時間後,漸漸可以自行安裝功能外掛,變更主題樣式,壞處就是太多主題和外掛可選擇,很容易把編輯器弄雜亂。

這時可以試試看 visual studio code,預設就有幾個還不錯的主題外觀,也內建很多語言的編輯功能,語法高亮顯示等,不需自行擴充,但還是要克制一點 (IDE 也很有趣 🐳),以免太專注在打造編輯器,而不是在開發程式。

選擇一:安裝 sublimte text

brew install --cask sublime-text

選擇二:安裝 visual studio code

brew install --cask visual-studio-code

選擇三:什麼都不裝,任何文字編輯器都可以寫 PHP 程式,例如 macOS 內建文字編輯.app。

3. 開始寫程式

找個目錄,寫個 php 程式,檔名 echo.php

<?php
echo '我成功啦!';

執行看看

php echo.php // 應該會看到 我成功啦!

建立本機測試網站

php -S localhost:8080

使用瀏覽器開啟 http://localhost:8080/echo.php ,我成功啦 😂

PHP Session Tracking 教學

HTTP 是一種無狀態協定,意思是每一次的 Request 都是全新的,SERVER 不會知道連續的幾個 Request 都屬於同一個人,或是由不同人發出。

整個 Web 都是無狀態,所以需要借助一些機制,讓我們可以追蹤使用者,完成購物車或其他類似功能,這樣的機制通常稱為 session tracking。

session tracking 有很多不同方式,例如在網頁放一個隱藏欄位,內容是隨機的亂數值,這個值會在使用者操作頁面中一直傳送,這樣就可以追蹤造訪者的狀態。

另一個方式是直接在網址後面加上參數,例如 http://localhost/?userid=123456 ,利用 userid 參數確認使用者是誰,缺點也很明顯,容易竄改,這樣的方式也稱為 URL rewriting。

第三種最常見的方式是使用 cookie,由 Server 產生一小片資料交給瀏覽器存著,每一次 Request 都會附帶 cookie,這樣也是追蹤的方式,PHP 有內建的 Session Tracking 機制,就是使用 cookie 或 url tracking。

現代瀏覽器為了安全因素,可以讓使用者決定阻擋 cookie,如果瀏覽器設定阻擋 cookie,大多數的網站可能就不能登入了。

開始練習,在同一個目錄,新增 session.php

<?php  
session_start(); // 開始或恢復已存在 Session

if(isset($_SESSION['views'])) //判斷是不是來過
{
    $_SESSION['views'] = $_SESSION['views'] + 1; //已來過,瀏覽次數 + 1
    echo session_id() . ' view ' . "{$_SESSION['views']} times";
}
else
{
    echo session_id() . ' first login'; //第一次瀏覽
    $_SESSION['views'] = 1; //開始計數瀏覽次數
}

開啟網址 http://localhost:8080/session.php
第一次開啟這個頁面,會顯示自動產生的 session id,和 first login 文字,之後的每一次重新整理,都會自動將瀏覽次數加一。

第一次登入
重新整理第六次

如何恢復成第一次登入狀態呢,把 cookie PHPSESSID 刪掉,就會失去 session,重新開始。

開啟瀏覽器開發人員工具,進入應用程式,儲存空間下面有 Cookie 項目,檢視 http://localhost:8080 中的 cookie 即可看到 PHPSESSID p9d9psf7u6sj5pl5v9pv7pfnrc。

刪掉它即重新開始 Session。

語言規則參考說明

這裡列出範例中使用的 PHP 語言規則。

PHP 檔案標頭

PHP 程式和 HTML 可以混在一起寫,那麼如何區分檔案中的那個部分是 PHP 程式呢,就要用 <?php?> 標識出來。

<?php
    echo 'this is your php code'
?>

如果這支 PHP 檔案,從頭到尾都是 PHP 程式,沒有包含 HTML 或 Javascript 等等的話,最後的 ?> 可以省略,也建議省略。

sesssion_start()

開始一個新 session,或是恢復已存在的 session。
每個讀者第一次造訪,這個 function 會為造訪者產生一個不重複的唯一 session ID,預設這個 session ID 會儲存在 cookie,名稱為 PHPSESSID,如果使用者的瀏覽器不支援 cookies 或阻擋 cookies,這個 session ID 會附加在 URL 後面。

session_id()

session_id() 回傳 session_start() 產生的 session ID。

$_SESSION

PHP 提供的預設變數,是一個陣列,可用來儲存 Session 相關資料,如上面的範例,我們用關鍵字 views 儲存造訪者的瀏覽次數。

$_SESSION['views'] = 1; // 設定 views 的值為 1,這也稱為 key-value pair。

if else

所有語言都有的條件判斷式。

if (條件) {
    // 如果就 ...
} else {
    // 不然呢 ...
}

isset

PHP 常用的變數檢查,上面的範例用來判斷是不是第一次瀏覽網頁。

// 判斷是否有 views 這個值,第一次造訪後才會設定,所以只在第一次造訪時回傳 false,之後都回傳 true
isset($_SESSION['views']); 

echo

給它什麼就回什麼,需要顯示任何資料、文字、變數等等,echo。

最後

從 Session Tracking 學習,可以延伸很多技術,大多是網站必備的功能。

  • 網站登入
  • 購物車
  • 環境設定

這個範例並沒有登入機制,但 Session Tracking 就是登入機制的基礎,先了解 Session Tracking,之後學習完整登入流程就容易許多。

相關參考: