【问题标题】:Nginx PHP-FPM and curl hangs subsequent browser to server requestsNginx PHP-FPM 和 curl 将后续浏览器挂起到服务器请求
【发布时间】:2016-07-06 14:19:21
【问题描述】:

我的服务器上安装了 php-fpm 和 nginx 堆栈。

我正在运行一个 JS 应用程序,它会触发一个 AJAX 请求,该请求在内部使用 curl 连接到第三方服务。该服务需要很长时间才能响应,例如大约 150 秒。

现在,当我连接到另一个浏览器选项卡上的同一页面时,它甚至不会返回触发 ajax 请求的页面上的 javascript 代码。基本上所有后续请求都会继续加载,直到 curl 返回响应或超时。

在这里,我将 proxy_read_timeout 设置为 300 秒。

我想知道为什么 nginx 持有资源而不为其他客户端提供服务。

【问题讨论】:

  • 您有多少 PHP5-FPM 工作人员正在运行? JS 应用程序是否也从 PHP 脚本返回?你的 NGINX 配置看起来如何?
  • 从一个php脚本返回的Js应用有4个php-fpm worker
  • nginx conf worker_connection 1024 worker_processes 5 sendfile on; tcp_nopush 开启; tcp_nodelay 开启; keepalive_timeout 65;
  • 如果是这种情况,那么您的请求不太可能正在等待 FPM 处理。其他东西正在挂起它。您应该启用 FPM 慢请求日志,并在长 AJAX curl 请求之后的后续请求期间检查 nginx 访问/错误日志。
  • 当然。我将启用 FPM 慢速请求日志

标签: php curl nginx


【解决方案1】:

问题是由于 PHP 会话锁定造成的。当我以前发出某个请求时,PHP 曾经锁定会话文件,并且只有在请求完成后才会释放。

为避免这种情况,您可以使用session_write_close()。就我而言,我实现了 redis 会话。

问题解决了!!!

【讨论】:

  • 很高兴知道!你是怎么发现这个的
  • 我创建了一个 PHP 页面并添加了 sleep(100)。在执行此操作时,我在返回结果的下一个选项卡上请求了相同的 url。这促使我在 sleep(100) 之前添加 session_start()。
猜你喜欢
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2023-01-07
  • 2021-01-04
  • 2023-03-10
  • 2017-09-18
相关资源
最近更新 更多