我有一个问题,我正在使用 nginx 和 PHPFPM。 我正在为 2 个 phpfpm 服务器 使用负载均衡器。
为了保持来自两个 phpfpm 服务器的 session 同步,我使用了 memcached。 但是当我使用 memcached 时,我发现页面正在变慢。
当我使用文件作为 session 保存类型时,网络运行速度更快,但 session 不会立即同步(我猜文件是 owerwriting)。我正在使用 NFS 来共享 session 。
在为 phpfpm 服务器使用 nginx 负载均衡器时,请问如何同步 session ?
最佳答案
您可能在这里看到的 PHP 使用 NFS 而不是 memcached 的速度提升本质上是一种欺骗性。 PHP session 存储默认以先到先得的方式获取锁。这意味着针对同一 session 向 PHP 发出的两个并发请求将导致第一个请求锁定 session ,直到 PHP 完成或您显式调用 session_write_close()
。从您的代码中释放锁。
但是在基于文件的 session 存储中,PHP 依赖于 flock,这在 NFS 中不起作用。
The NFS (Versions 2 and 3) protocol does not support file locking
因此对于分布式 session 存储,您很少需要基于慢速文件系统的锁定。无论如何,大多数内存存储工作得更快。由于 NFS 通常无法处理 flock 调用,如果两个并发请求试图写入同一个 session 文件,您的 session 将被破坏。换句话说,您所看到的更快基本上只是您的请求可能破坏它们的 session 更快,因为并发 session 没有锁定。
如果您的请求需要很长时间并且不需要 session ,那么最好在完成 session 后尽可能早地在代码中显式调用 session_write_close
,以便任何其他并发进来的请求可以进入 session 。当您对 PHP(比如通过 AJAX)执行大量长轮询请求时,这通常是一个问题。
关于php - NGINX + phpFPM 负载均衡器和 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39315745/