我有这个PHP网站,它会进行一些重要的ajax调用。它们需要大约8-10秒,并通过cURL请求与许多第三方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调用外部网站导致了这个问题。
不确定缺少什么。
谢谢!
答案 0 :(得分:0)
听起来你需要拨打session_write_close
当脚本写入会话时,PHP会锁定会话文件,因此每个页面必须等待该页面才能打开会话(除非您在写入后调用上述函数)。
例如,假设您有一个长时间运行的Ajax进程,该进程在开始时写入会话。如果你没有调用session_write_close告诉PHP你的脚本写完了会话,它会锁定所有其他脚本的会话,直到执行完毕。