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

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

phpmianshi4年前 (2017-06-03)php194
同事接到一个需求,需要调用同一个项目的另一个接口,于是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中global与$GLOBAL由引用产生的区别

很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。根据官方的解释是$GLOBALS['var'] 是外部的全局变量$var本身。global $var 是外部...

记一次tp3.2.3因fetch导致的漏洞处理过程

记一次tp3.2.3因fetch导致的漏洞处理过程

问题描述:最近发现百度收录大幅度下降,并出现大量5xx错误,有些收录页面直接跳转到其他网站,如下图:问题追查1.根据以往经验首先怀疑网站被植入或者挂马      &nbs...

Fiddler抓包设置及常见问题

Fiddler抓包设置及常见问题

Fiddler简介官网:https://www.telerik.com/fiddlerFiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够...

PHP7 数组的底层实现

PHP7 数组的底层实现

PHP 数组具有的特性PHP 的数组是一种非常强大灵活的数据类型,在讲它的底层实现之前,先看一下 PHP 的数组都具有哪些特性。可以使用数字或字符串作为数组健值$arr = [1&...

php中容易出错的小案例

sprintf用到sprintf 的时候 如果有传递的变量  如果变量可能出现 % ,则容易出错<?php $content = "%')(...

php中如何优雅的写复杂if-else

提前return优化逻辑结构,让正常流程走主干,非正常流程提前return,去除不必要的else优化前$a = 1; $b = 2; $c =&n...

发表评论

访客

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