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

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

phpmianshi3年前 (2017-06-03)PHP141
同事接到一个需求,需要调用同一个项目的另一个接口,于是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内核分析之生命周期(三)

一、概览PHP生命周期有五个阶段,分别为模块初始化阶段、请求初始化阶段、执行阶段、请求关闭阶段、模块关闭阶段。只是不同SAPI模式下,请求的情况略有不同,比如FastCGI下只经历了一次模块初始化阶段...

PHP内核分析之常见变量基本结构(六)

一、类型一览zval中的u1.v.type用来存储变量的类型,而zval.value存储的是不同类型对应的值,所以type决定value取值的地方,以下是PHP7所定义的所有类型。#define&nb...

PHP数组的有序性

在 PHP7中,我们往数组中插入元素的顺序,就决定了我们数组遍历元素的顺序。可以说,PHP7中的数组是有序的。这个有序就是指元素插入数组时的顺序,与遍历时顺序的一致性。为了实现插入与遍历的顺序一致性,...

PHP中self与static区别和联系

PHP官方也说过,大概意思是说self调用的就是本身代码片段这个类,static - PHP 5.3加进来的只得是当前这个类,有点像$this的意思,static调用的是从堆内存中提取出来,访问的是当...

PHP内核分析之源码目录结构 (二)

一、目录概览以php-7.4.1为例,目录多达十多个,下面介绍主要目录。├── build   linux下编译相关的目录├── ext      P...

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

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

发表评论

访客

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