2024年PHP开发者大会(日本)

会话支持

Memcached提供了一个自定义会话处理程序,可用于将用户会话存储在memcache中。内部使用完全独立的memcached实例,因此如有必要,您可以使用不同的服务器池。会话密钥存储在memc.sess.key.前缀下,如果您对会话和通用缓存使用相同的服务器池,请注意这一点。

session.save_handler 字符串

设置为memcached以启用会话支持。

session.save_path 字符串

定义一个用逗号分隔的主机名:端口条目,用于会话服务器池,例如"sess1:11211, sess2:11211"

添加注释

用户贡献的注释 10条注释

nfoo at naver dot com
14年前
如果您想使用'memcacheD'扩展而不是'memcache'(有两个不同的扩展)来控制会话,您应该注意修改php.ini

来自谷歌的大多数网络资源都基于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"

看,没有协议标识符。
richard at fussenegger dot info
11年前
文档不完整,您还可以传递每个服务器的权重,如果需要,您可以使用套接字。在您的PHP ini中:

<?php

// 格式为socket_path:port:weight的带权重的套接字
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());

?>
taubers at gmail dot com
12年前
如果您使用memcache类进行会话处理,您的密钥是PHP会话ID。这与使用memcached类时不同。

memcache示例
GET nphu2u8eo5niltfgdbc33ajb62

memcached示例
GET memc.sess.key.nphu2u8eo5niltfgdbc33ajb62

对于memcached,前缀在配置中设置:
memcached.sess_prefix = "memc.sess.key."
Ian Maddox
10年前
如果您正在设置会话数据,并且它立即消失,并且您在PHP错误日志中没有收到任何警告,则可能是因为您的会话在1970年代某个时候过期了。

在memcached 1.0.2和2.1.0之间,memcached会话处理程序对30天TTL问题(又名“透明故障转移”)变得敏感。如果您的session.gc_maxlifetime大于2592000(30天),则该值将被视为unix时间戳而不是相对秒数。

此问题可能会影响任何拥有长期运行会话并从Ubuntu 12.04升级到14.04的用户。
madalin at mgiworx dot co dot uk
9年前
简短说明:Memcached支持身份验证。
velazcomtz dot miguel at gmail dot com
6年前
重要的是要说明memcached与常规PHP会话一样不是并发的。

如果您有两个标签,其中一个响应时间过长,并尝试在第二个标签上注销,memcached服务器将无法响应。
Andrei Darashenka
15年前
此扩展支持会话锁定!

默认情况下
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很棒,速度极快,用途广泛且实用,可扩展,是许多项目必备的。

但是,如果您只想通过最小化会话文件阻塞来提高速度,还有一个不错的替代方案,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会话的基本持久性

[单元]
描述=PHP tmpfs会话在关机/启动时备份/恢复
之前=php-fpm.service

[服务]
类型=单次执行
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

[安装]
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年7月28日01:06关于tmpfs会话目录的评论进行更正……

我用来安装会话文件的tmpfs目录是“/run”,而不是“/tmp”……因为/tmp有时会自动(或手动)删除。
To Top