memcached 非常棒,速度極快,用途廣泛且實用,可擴展,是許多專案必備的工具
但如果您只是想要速度來盡量減少 session 檔案的阻塞,還有一個不錯的替代方案,tmpfs
https://eddmann.com/posts/storing-php-sessions-file-caches-in-memory-using-tmpfs/
如果您使用 Debian,/tmp 中可能已經有 session 目錄(掛載為 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/