PHP Conference Japan 2024

Sessions 支援

Memcached 提供了一個自訂的 Session 處理器,可用於將使用者 Session 儲存在 memcache 中。它內部使用一個完全獨立的 memcached 實例,因此您可以根據需要使用不同的伺服器池。Session 金鑰儲存在前綴 memc.sess.key. 下,如果您將相同的伺服器池用於 Session 和一般快取,請注意這一點。

session.save_handler 字串

設定為 memcached 以啟用 Sessions 支援。

session.save_path 字串

定義以逗號分隔的 主機名稱:埠 項目列表,用於 Session 伺服器池,例如 "sess1:11211, sess2:11211"

新增筆記

使用者貢獻的筆記 10 筆筆記

76
nfoo at naver dot com
14 年前
如果您想使用 'memcacheD' 擴充套件而不是 'memcache'(這是兩個不同的擴充套件)來控制 session,您需要注意修改 php.ini

Google 上大多數網路資源都是基於 memcache,因為它是比 memcacheD 更早的版本。它們會如下所述

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

但當使用 memcacheD 時,這就無效了

您應該像這樣修改 php.ini

session.save_handler = memcached
session.save_path = "localhost:11211"

請注意,這裡沒有通訊協定識別字
17
richard at fussenegger dot info
11 年前
文件並不完整,您也可以傳遞每個伺服器的權重,並且您可以根據需要使用 sockets。在您的 PHP ini 檔案中

<?php

// 使用 socket_path:port:weight 格式設定帶權重的 Sockets
session.save_path = "/path/to/socket:0:42"

// 或者設定多個,這樣權重才有意義?
session.save_path = "/path/to/socket_x:0:42,/path/to/socket_y:0:666"

?>

如果您想在 PHP 中存取這些伺服器

<?php

$servers
= explode(",", ini_get("session.save_path"));
$c = count($servers);
for (
$i = 0; $i < $c; ++$i) {
$servers[$i] = explode(":", $servers[$i]);
}
$memcached = new \Memcached();
call_user_func_array([ $memcached, "addServers" ], $servers);
print_r($memcached->getAllKeys());

?>
19
taubers at gmail dot com
12 年前
如果您使用 memcache 類別來處理 session,您的鍵值是 PHP session ID。這與使用 memcached 類別時不同。

使用 memcache 的範例
GET nphu2u8eo5niltfgdbc33ajb62

使用 memcached 的範例
GET memc.sess.key.nphu2u8eo5niltfgdbc33ajb62

對於 memcached,前綴是在設定中設定的
memcached.sess_prefix = "memc.sess.key."
12
Ian Maddox
10 年前
如果您正在將資料設定到 session,但它立即消失了,並且您的 PHP 錯誤日誌中沒有任何警告,則可能是因為您的 session 在 1970 年代的某個時間過期了。

在 memcached 1.0.2 和 2.1.0 之間的某個版本,memcached session handler 開始受到 30 天 TTL 陷阱(又稱「透明失效轉移」)的影響。如果您的 session.gc_maxlifetime 大於 2592000(30 天),該值會被視為 Unix 時間戳記,而不是相對的秒數。

從 Ubuntu 12.04 升級到 14.04 的使用者,如果使用長時間運行的 session,很可能會遇到這個問題。
madalin at mgiworx dot co dot uk
9 年前
簡述:Memcached 支援驗證功能。
velazcomtz dot miguel at gmail dot com
6 年前
必須說明的是,memcached 與一般的 PHP session 一樣,並不支援並行。

如果您開啟兩個分頁,其中一個分頁回應時間過長,而您嘗試在第二個分頁登出,memcached 伺服器將不會回應。
Andrei Darashenka
15 年前
此擴充功能支援 Session 鎖定!

預設情況下:
MEMC_SESS_LOCK_ATTEMPTS 30
MEMC_SESS_LOCK_WAIT 100000
MEMC_SESS_LOCK_EXPIRATION 30
benoit dot delmotte at gmail dot com
7 年前
如果有多個 memcached 伺服器,
分隔符號是分號 ( ; ),而不是逗號。

範例
session.save_path = "sess1:11211; sess2:11211"
atesin > gmail
4 年前
memcached 非常棒,速度極快,用途廣泛且實用,可擴展性強,是許多專案的必備工具。

但如果您只是想要提高速度以盡量減少 session 檔案的阻塞,tmpfs 也是一個不錯的替代方案。

https://eddmann.com/posts/storing-php-sessions-file-caches-in-memory-using-tmpfs/

如果您使用 Debian,session 目錄可能已經位於 tmp(掛載為 tmpfs),但請注意每日清除程序可能會影響您的 session。

如果您使用 CentOS/其他系統(像我一樣),或者即使您使用 Debian 但想擺脫 /tmp 清除任務,也可以使用這個技巧。

我發現我的系統中 /run 也被掛載為 tmpfs,所以我關閉了 php-fpm,將我的 php session 目錄移到 /tmp/,重新設定 php,然後重新啟動...(您可以根據自己的情況調整)。

systemctl stop php-fpm
cp -a /var/lib/php/session /tmp/php-session
vim /etc/php-fpm-d/www.conf
------
php_value[session.save_path] = /run/php-session
------
systemctl start php-fpm

唯一的缺點是 tmpfs 是揮發性的,就像 memcached 一樣(卸載/關機/斷電時資料會遺失),為了避免這種風險,我寫了另一個服務,在 php 啟動/停止之前/之後恢復/備份 php session 目錄...(未經測試!)

vim /etc/systemd/system/php-session-backup.service
------
# tmpfs php sessions 的基本持久性

[Unit]
Description=關機/開機時備份/恢復 PHP tmpfs sessions
Before=php-fpm.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=rm -fr /run/php-session
ExecStart=cp -fa /var/lib/php/session /run/php-session
ExecStop=rm -fr /var/lib/php/session
ExecStop=cp -fa /run/php-session /var/lib/php/session

[Install]
WantedBy=multi-user.target
------
systemctl enable php-session-backup

您也可以搭配每日備份任務,以防系統崩潰,這樣您只會損失一天的資料。

crontab -e
------
0 4 * * * rm -fr /var/lib/php/session;cp -fa /run/php-session /var/lib/php/session
------

不過,這非常粗糙,您可以更好地使用 inotify + rsync,可以從這裡獲得一些想法

https://blog.jmdawson.co.uk/persistent-ramdisk-on-debain-ubuntu/
atesin > gmail
4 年前
版主您好,請合併這些貼文。

我於 2020-07-28 01:06 關於 tmpfs session 目錄的評論勘誤…

我用來安裝 session 檔案的 tmpfs 目錄是「/run」而不是「/tmp」… 因為 /tmp 有時會被自動(或手動)刪除。
To Top