php - NGINX + phpFPM 负载均衡器和 session

标签 php session nginx

我有一个问题,我正在使用 nginxPHPFPM。 我正在为 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

See this answer on unix stackexchange

因此对于分布式 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/

相关文章:

php - 默认内容放在哪里?代码还是数据库?

PHP- fatal error : Call to a member function dbRows() on a non-object

php - 如何设置 Telegram bot webhook?

php - session 变量未保持设置状态

linux - nginx负载均衡器打开的文件太多

node.js - AWS ElasticBeanStalk Node 中的套接字 Io

javascript - 如何在不重定向的情况下获取 PHP 脚本?

java - 使用 session 将参数发送到 Liferay Portlet

php - Codeigniter 和 PHP 检查 session 是否存在

Laravel Sail (docker), nginx 反向代理 - Html 呈现 localhost :8002 instead of site. xyz