首页 > php > Windows下nginx+fastcgi+php的并发阻塞问题
2017
06-03

Windows下nginx+fastcgi+php的并发阻塞问题

同事接到一个需求,需要调用同一个项目的另一个接口,于是CURL调用接口。

代码撸完了,本地测试一下 浏览器一直转圈圈直到超时…… 百思不得其解


主要是windows+nginx开发环境遇到的问题,本人很少用windows开发所以也是第一次遇到,整理如下:
问题描述:
同一个项目中2个接口互相调用   api1  curl调用 api2 ,同时属于项目A

问题原因:
windows+nginx 其实无法真正的并行执行脚本,linux,mac下无问题,所以api1 curl调用api2接口的时候,api1先执行占用了cgi,没有完成,调用api2,api2这时候等待api执行完才能真正的执行,但是api1还在等待api2,所以产生了 ”死锁“

nginx以高并发闻名,怎么偏偏默认不支持并发?
Windows下PHP_FCGI_CHILDREN无效 (具体参见PHP BUG#49859) 一般情况下Windows下Nginx的配置都是fastcgi_pass 127.0.0.1:9000; 也就是说cgi根本不会自动产生新进程去处理并发请求,只能排队 那要怎么办?

既然不能自动生成,那就只好手动咯 动手解决 我准备额外启动3个php-cgi去处理并发请求 首先在nginx.conf中进行如下配置:
upstream phpfastcgi_proxy {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}

重启Nginx。 现在,Nginx会自动将请求转发给9000-9003

还需要启动对应数量的php-cgi去监听端口 快捷键Win+R打开运行,输入cmd进入命令行,录入以下代码:
E:/php/php-cgi.exe -b 127.0.0.1:9001 -c E:/php/php.ini

任务管理器中会发现多了一个php-cgi进程,netstat -a也能够看到9001端口被监听了 注意不要把命令行关掉了,而是要继续打开一个新的命令行 此时你已成功了一次,你还需要继续成功两次才能监听到9002和9003…… 额外的3个php-cgi进程启动成功后,你就拥有了一个并发数为4的本地环境



本文》有 0 条评论

留下一个回复