【问题标题】:PHP site is waiting on ajax calls to completePHP 站点正在等待 ajax 调用完成
【发布时间】:2014-10-29 18:47:38
【问题描述】:

我有一个 PHP 站点,它可以进行大量的 ajax 调用。它们大约需要 8-10 秒,并通过 cURL 请求与许多第 3 方 API 进行通信。

当这些 ajax 调用正在进行时,站点的其余部分没有响应。不仅仅是这个页面,还有另一个页面上的另一个浏览器选项卡。

我应该检查什么以确保 PHP 能够分叉多个进程以使网站不会挂起?

PHP 作为 PHP-fpm 运行

location ~ \.php$ {
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
    fastcgi_buffers 256 64k;
    fastcgi_buffer_size 2400k;
    fastcgi_read_timeout 6000;
    uwsgi_read_timeout 6000;
    include fastcgi_params;
}

而且 nginx 有足够的工作进程

user www-data;
worker_processes 16;
pid /var/run/nginx.pid;

events {
   worker_connections 8000;
   multi_accept on;
}

另外,我已经使用 sleep() 和一个长 for 循环进行了测试。这两个都很好。似乎只是对外部站点的 cURL 调用导致了问题。

不确定缺少什么。

谢谢!

【问题讨论】:

  • 听起来您正在运行您的 AJAX,并将异步功能设置为 false。你是如何设置你的 AJAX 的?
  • 所有其他 ajax 都很好用。它只是在后端进行 cURL 调用的那些
  • 显示你的javascript
  • $.post("mycall.php");如果 mycall.php 对 php sleep() 函数进行 cURL 调用,则站点在睡眠完成之前没有响应。

标签: php process


【解决方案1】:

听起来你需要打电话给session_write_close

当脚本写入会话时,PHP 会锁定会话文件,因此每个页面都必须等待该文件完成执行才能打开会话(除非您在写入后调用上述函数)。

例如,假设您有一个长时间运行的 Ajax 进程,它在开始时写入会话。如果您不调用 session_write_close 来告诉 PHP 您的脚本已完成写入会话,它将锁定所有其他脚本的会话,直到执行完成。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2014-07-06
  • 2018-06-09
  • 1970-01-01
  • 2017-05-20
  • 2011-09-06
相关资源
最近更新 更多