將 PHP Session 儲存於 Memcached 可解決多伺服器負載平衡下的 Session 共享問題,並提升讀寫效能。本文說明兩種設定方式:修改 php.ini(永久生效)與 ini_set()(單腳本動態生效)。
apt-get install memcached 或 yum install memcached。pecl install memcached(注意是 memcached 非 memcache,前者基於 libmemcached,功能更完整)。extension=memcached.so 於 php.ini。; php.ini
session.save_handler = memcached
session.save_path = "tcp://127.0.0.1:11211"
; 多台 Memcached 以逗號分隔,可指定權重:
; session.save_path = "tcp://192.168.1.10:11211?weight=2, tcp://192.168.1.11:11211?weight=1"
<?php
// 必須在 session_start() 之前呼叫
ini_set('session.save_handler', 'memcached');
ini_set('session.save_path', 'tcp://127.0.0.1:11211');
// 正常使用 Session
session_start();
$_SESSION['user_id'] = 123;
?>
php.ini,不影響其他腳本。session_init.php,所有入口檔 require_once 'session_init.php';。<?php
session_start();
$_SESSION['test'] = 'hello';
echo 'Session ID: ' . session_id() . '<br>';
// 使用 telnet 或 memcached-tool 檢查
// telnet 127.0.0.1 11211
// get
// 應看到序列化後的 Session 資料
?>
| 特性 | Memcached | Session (檔案/資料庫) |
|---|---|---|
| 資料狀態 | 無狀態(Key-Value,不綁定用戶) | 有狀態(綁定 Session ID 對應用戶) |
| 主要目的 | 緩存熱門資料、減輕 DB 壓力、加速讀取 | 維持用戶登入狀態、儲存個人化資料 |
| 資料持久性 | 暫存,重啟遺失、LRU 淘汰 | 可持久(檔案、DB、Redis、Memcached) |
| 安全性 | 知 Key 即可讀取,需內網隔離、防火牆 | Session ID 通常存於 Cookie,需防偽造、固定 |
session.gc_maxlifetime 設定過短。session.save_path 格式正確(tcp://host:port),Memcached 服務正常、防火牆放行。session.save_path 指向同一組 Memcached 叢集,且 session.name 一致。