我有一个问题,我正在使用 nginx 和 PHPFPM 。 我正在为 2 phpfpm服务器使用loadbalancer。
为了保持两个phpfpm服务器的会话同步,我使用了memcached。 但是当我使用memcached时,我发现页面正在放慢速度。
当我使用文件作为会话保存类型时,网络运行得更快,但会话不会立即同步(我猜文件是owerwriting)。我正在使用NFS来分享会话。
任何想法请问如何在为phpfpm服务器使用nginx loadbalancer时同步会话?
答案 0 :(得分:2)
使用NFS over memcached在PHP中看到的速度增加本质上是一个欺骗性。 PHP会话存储默认以先到先得的方式锁定获取。这意味着对同一会话的两个并发请求将导致第一个请求锁定会话,直到PHP完成或您从代码中明确调用session_write_close()
,以释放锁。
但是在基于文件的会话存储中,PHP依赖于flock,它在NFS中不起作用。
NFS(版本2和3)协议不支持支持文件锁定
因此,对于分布式会话存储,您很少需要基于文件系统的慢速锁定。无论如何,大多数内存商店的工作速度更快。由于NFS通常无法处理群集调用,因此如果两个并发请求尝试写入同一会话文件,则会话 将会损坏 。换句话说,您所看到的更快基本上是您的请求可能会更快地破坏其会话更快,因为会话没有锁定并发性。
如果您的请求需要很长时间并且不需要会话,那么在完成会话后尽可能在代码中尽早明确地调用session_write_close
以便任何其他并发请求都可以进入会话。当您对PHP执行大量长轮询请求时(例如通过AJAX),这通常是一个问题。