12

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

你用过吗?你测试过吗?效果好吗?你有会话锁定问题吗?

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

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

将其编译成 PHP 二进制文件的唯一要求是OSSP mm headers,下载量约为 330k。

 $ ./configure --help

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

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

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

我了解它的两个限制

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

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

4

1 回答 1

1

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

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

如果你在会话中写了很多,并且有合理的机会同时运行两个请求,那么你会在某个时候得到意想不到的数据。无论是什么问题,都与您需要依赖会话数据的程度有关。

如果您只写一次,然后全部读取,例如在登录时存储用户 ID,那么它应该工作得很好。

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

于 2020-04-19T08:47:58.277 回答