我有一套运行 APCu 扩展的 PHP 7.4 脚本,代码将其用作访问单一托管网站的所有用户的通用对象存储。由于我自己缺乏了解,后来我发现 APCu 缓存是建立的每个 PHP 进程所以我看到的是,在某些情况下用户 ‘a’获取的缓存值与用户 ‘b’(大概是因为 PHP-FPM 为用户‘b’分叉了一个新进程)。
但我仍然不清楚如何设置 php-fpm,以便所有传入的请求都位于来自同一父进程的子进程内。
APCu 大师克拉乔说了这个早在 2015 年(我以粗体强调):
只是回答原来的问题......正如@fruitl00p 所说,如果您使用 fpm,您可以通过配置解决无法共享的问题。
使用 fpm 和使用 fcgi 之间存在差异,我应该向 phptherightway 提交 PR 来清除它。
规则是只有子进程才能访问其父进程创建的内容; 在 FCGI 中,生成的进程不一定是其父进程的子进程,它们可能不是实际的分支。如果您的进程管理器的工作方式与传统的 FCGI/CGI 类似,那么您将无法共享;如果它的工作方式与 FPM 类似,并在父进程中初始化 PHP 并分支子解释器,那么您将不会遇到任何问题。
进一步的研究使我找到了 php-fpm www.conf 文件和以下设置:
pm = dynamic
pm.max_children = 50
那么 - 是否只需将其更改为:
pm = static
pm.max_children = 50
即这是强制 php-fpm 确保所有子进程指向单个父进程的方法吗?这样,就能确保只有一个全局 APCu 缓存在起作用?我意识到我需要进行数学运算才能找出正确的 pm.max_children 值。
请注意:目前我无法切换到 memcached,因为我依赖通过 APCUIterator 对象对 APCu 键进行正则表达式迭代。我最终可能会实现这一点,但目前我必须坚持使用 APCu。