会话支持

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

session.save_handler 字符串

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

session.save_path 字符串

定义一个由逗号分隔的 hostname:port 条目列表,用于会话服务器池,例如 "sess1:11211, sess2:11211"

添加注释

用户贡献注释 12 个注释

76
nfoo at naver dot com
13 年前
如果您想使用“memcacheD”扩展而不是“memcache”(有两个不同的扩展)进行会话控制,则需要注意修改 php.ini

来自 Google 的大多数网络资源都基于 memcache,因为它比 memcacheD 早。

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

但是当涉及到 memcacheD 时,它无效。

您应该像这样修改 php.ini

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

请注意,没有协议标识符
17
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());

?>
12
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 的拥有长时间运行会话的用户。
19
taubers at gmail dot com
11 年前
如果您使用 memcache 类进行会话处理,则您的密钥是 PHP 会话 ID。这与使用 memcached 类时不同。

使用 memcache 的示例
GET nphu2u8eo5niltfgdbc33ajb62

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

对于 memcached,前缀在配置中设置
memcached.sess_prefix = "memc.sess.key."
3
madalin at mgiworx dot co dot uk
9 年前
简短说明:Memcached 支持身份验证。
2
velazcomtz dot miguel at gmail dot com
5 年前
重要的是要注意,memcached 与常规 PHP 会话一样,不是并发的。

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

默认情况下
MEMC_SESS_LOCK_ATTEMPTS 30
MEMC_SESS_LOCK_WAIT 100000
MEMC_SESS_LOCK_EXPIRATION 30
2
benoit dot delmotte at gmail dot com
7 年前
对于多个 memcached 服务器,
分隔符是分号 (;),而不是像写入的那样用逗号分隔

例如
session.save_path = "sess1:11211; sess2:11211"
1
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 会话的基本持久性

[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/
0
atesin > gmail
4 年前
版主请合并这些帖子

关于 2020-07-28 01:06 关于 tmpfs 会话目录的评论的勘误。

我用来安装会话文件的 tmpfs 目录是 "/run" 而不是 "/tmp"... 因为 /tmp 有时会自动(或手动)删除。
-8
sstratton at php dot net
13 年前
虽然前一个发帖者说得对,Memcached 会清理以腾出空间来存放它的键,但考虑到活动会话很可能在 30 秒内再次被写入,因此活动会话的可能性相当低,只要你正确分配了内存分配。
-44
me at nileshgr dot com
10 年前
似乎有些人认为将会话保存到 memcache 中比保存到文件系统 (/tmp) 更安全,尤其是当讨论的是共享主机时。

这并不正确。memcache 没有身份验证;任何人都可以读取 session.save_path(它将包含 memcached 守护进程地址)。

当您考虑安全性以及共享主机时,FastCGI (PHP-FPM) 要好得多。

如果您想透明地跨多个服务器共享会话,而无需添加自定义处理程序的麻烦,可以使用 NFS 或类似的东西。
To Top