首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 存入 Memcached 完整設定指南:php.ini 與 ini_set 兩種方式

     編輯:PHP 相關知識

將 PHP Session 儲存於 Memcached 可解決多伺服器負載平衡下的 Session 共享問題,並提升讀寫效能。本文說明兩種設定方式:修改 php.ini(永久生效)與 ini_set()(單腳本動態生效)。

前置條件

  • 安裝 Memcached Server:apt-get install memcached 或 yum install memcached。
  • 安裝 PHP Memcached 擴展:pecl install memcached(注意是 memcached 非 memcache,前者基於 libmemcached,功能更完整)。
  • 啟用擴展:extension=memcached.so 於 php.ini。

方式一:修改 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-FPM/Apache 生效。
  • 所有 PHP 腳本自動使用 Memcached 儲存 Session,無需修改程式碼。

方式二:ini_set() 動態設定(無權限修改 php.ini 時)

<?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 的腳本開頭都要加入上述兩行。
  • 建議封裝為共用引入檔 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 vs Session:特性比較

特性MemcachedSession (檔案/資料庫)
資料狀態無狀態(Key-Value,不綁定用戶)有狀態(綁定 Session ID 對應用戶)
主要目的緩存熱門資料、減輕 DB 壓力、加速讀取維持用戶登入狀態、儲存個人化資料
資料持久性暫存,重啟遺失、LRU 淘汰可持久(檔案、DB、Redis、Memcached)
安全性知 Key 即可讀取,需內網隔離、防火牆Session ID 通常存於 Cookie,需防偽造、固定

Memcached 安全性建議

  • 將 Memcached 部署於內網,防火牆僅開放應用伺服器 IP 存取 11211 埠。
  • 啟用 SASL 認證(需編譯支援 SASL 的 memcached 與 PHP memcached 擴展)。
  • 避免儲存敏感資料(密碼、Token、個資),若必須儲存請加密。

適合存入 Memcached 的 Session 資料

  • 變動頻繁、非關鍵、可重算/可重取的資料:購物車暫存、瀏覽歷史、暫存偏好設定。
  • 不適合:交易狀態、權限標記、個人敏感資訊——應存於資料庫或加密儲存。

常見問題排查

  • Session 遺失:檢查 Memcached 是否重啟、記憶體不足導致 LRU 淘汰、session.gc_maxlifetime 設定過短。
  • 無法寫入:確認 session.save_path 格式正確(tcp://host:port),Memcached 服務正常、防火牆放行。
  • 多伺服器 Session 不同步:確認所有節點 session.save_path 指向同一組 Memcached 叢集,且 session.name 一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved