memcached 非常棒,速度快如闪电,用途广泛且实用,可扩展,对于许多项目来说是必不可少的
但是如果你只需要速度来最小化会话文件阻塞,还有一个不错的替代方案,tmpfs
https://eddmann.com/posts/storing-php-sessions-file-caches-in-memory-using-tmpfs/
也许如果你使用的是 Debian,你的会话目录已经位于 tmp(作为 tmpfs 挂载),但要注意每日清理过程可能会搞乱你的会话
如果你使用的是 CentOS/其他(像我一样),或者即使你使用的是 Debian 但想摆脱 /tmp 清理任务,你可以使用这个技巧
我意识到在我的系统中 /run 也是作为 tmpfs 挂载的,所以我关闭了 php-fpm,将我的 php 会话目录移动到 /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 会话目录...(未测试!)
vim /etc/systemd/system/php-session-backup.service
------
# 用于 tmpfs php 会话的基本持久性
[Unit]
Description=PHP tmpfs 会话在关闭/启动时备份/恢复
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/