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/