当前位置:首页 > php > 正文内容

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

phpmianshi4年前 (2017-06-03)php429
同事接到一个需求,需要调用同一个项目的另一个接口,于是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的本地环境



版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

PHP中max_execution_time设置不生效

问题描述:max_execution_time设置了1秒,但是发现超过3秒的脚本还是跑。于是深入研究下max_execution_time不生效的原因。官网描述:https://www.php.net...

PHP数组实际占用内存大小的分析

1.数组正常的赋值是不会发生内存改变的,但是当赋值的新数组发生改动的时候,php就会新开辟内存给新的数组,这里会造成无谓的内存消耗。最好是不要直接这样赋值,如果非赋值不可的话,记得加上‘&’符...

php中使用swoole加速lumen项目-laravelS实战

背景公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目https://github.com/hhxsv5/laravel-s下面...

composer autoload自动加载性能优化指南

简介composer 提供的 autoload 机制使得我们组织代码和引入新类库非常方便,但是也使项目的性能下降了不少 。composer autoload 慢的主要原因在于来自对 PSR-0 和 P...

php中如何合并多个pdf并压缩

背景市面上常见的pdf处理软件,大部分都是收费的,经常功能不全,有时我们需要合并多个pdf文件,有时甚至还需要压缩一下大小,我怎么能用PHP做到这一点呢?解决方案(一)利用linux命令gs、pdf2...

PHP中跨域原理以及解决方案

1.为啥出现跨域在制定Html规则时,为了安全的考虑,一个源的脚本(网页,网站)不能与另一个源的资源进行交互,所以就引发一个词叫做“同源策略”。所谓同源(即指在同一个域),就是两个页面具有相同的协议(...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。