什么是 PHP 共享内存 (mm, --with-mm) 会话模块?

What is the PHP Shared Memory (mm, --with-mm) session module?

提问人:Jeff 提问时间:8/20/2013 最后编辑:CommunityJeff 更新时间:4/19/2020 访问量:2097

问:

什么是 PHP 共享内存分配(mm,编译 --with-mm)会话模块?

你用过吗?你测试过吗?效果好吗?您是否遇到会话锁定问题?

使用文件或自定义会话处理程序(如数据库)时,很容易查看会话数据的内容,但是否可以使用此模块查看会话数据?想要查看会话数据的个人原因是 (1) 测试 PHP 垃圾回收是否正常工作,以及 (2) 确保它不会占用所有系统内存。

我认为它曾经是一个单独的(PECL?禅?扩展,但现在它在核心中。

将其编译成 PHP 二进制文件的唯一要求是 OSSP mm 标头,这是一个小型的 ~330k 下载。

 $ ./configure --help

// --with-mm=DIR   SESSION: Include mm support for session storage

我能找到的唯一信息来自2006年的留言板帖子,该帖子引用了现已丢失的Zend会话教程页面[404],作者引用了该页面:

如果您需要更高的性能,mm 模块是一个可行的替代方案; 它将数据存储在共享内存中,因此不受限制 硬件 I/O 系统。

我了解它的两个局限性

(1) 注意的是,mm 的会话存储模块不能保证 对同一会话的并发访问已正确锁定。它可能 更适合使用基于共享内存的文件系统(例如 tmpfs(在 Solaris/Linux 上)或 /dev/md(在 BSD)上)将会话存储在文件中, 因为它们被正确锁定。(2) 会话数据存储在内存中 因此,Web Server Restart 会将其删除。

我真的很想要一个规范的描述,但任何和所有的信息都是值得赞赏的。

PHP Linux 会话 模块

评论

1赞 Gorgsenegger 5/18/2019
使用 ,原始页面的内容可以在这里找到:web.archive.org/web/20070207084440/http://devzone.zend.com/node/...archive.org
0赞 Joy 11/14/2022
@Jeff我一直在寻找这个问题的答案太久了。还没有找到任何在任何地方使用 mm 模块的权威指南。甚至在 php 文档中也没有。如果您已成功设置,您能否分享您的发现

答:

1赞 Laus Brandt 4/19/2020 #1

我没有在会话中使用共享内存,但我最近一直在使用 https://www.php.net/manual/en/book.shmop.php 这似乎是用于会话的内存。

共享内存的奇妙之处在于,它是一种在进程之间共享数据的疯狂快速方式。这样做的代价是,由于您只是直接存储在内存中,因此无法控制谁在何时写入(并且它不是持久的)。在内存文件系统中使用文件会话可以解决这个问题,方法是在顶部添加文件系统层(REDIS 和 memcached 也处理这个问题)。

如果你在会话中写入了大量内容,并且有合理的机会同时运行两个请求,那么你将在某个时候获得意外的数据。 无论这是什么问题,您都需要在多大程度上依赖会话数据。

如果你只写了一次,然后就全部被读取了,就像在登录时存储用户 ID 一样,那么它应该可以很好地工作。

关于 GC,会话模块之间应该没有区别。