问题总结:php-curl在nginx中访问超时,在CLI环境正常

为了测试本地php代码,由于电脑内存限制,无法运行虚拟机,于是搭建了本地web服务调试环境Windows、Nginx、php-cgi、mysql

由于xdebug调试服务9000端口已占用,所以php-cgi使用了9001端口,在nginx配置中需要做响应更改

1 fastcgi_pass 127.0.0.1:9001;

启动服务:

nginx> start /b nginx.exe
nginx> net start mysql56
nginx> cd path_to_php
php> php-cig.exe -b 127.0.0.1:9001

停止服务

php> Ctrl+C^
php> cd path_to_nginx
nginx> net stop msyql56
nginx> nginx.exe -s stop

一直以来跑的都很顺畅,今天突然遇到了问题,发现在php中有curl请求的时候,通过nginx访问请求会超时,在CLI环境中正常。

于是就到百度上搜索,苦搜无果,最终在google上搜到结果,地址如下:
http://stackoverflow.com/questions/13813667/php-curl-timing-out-but-cli-curl-works?rq=1

因为本地只启了一个php-cgi进程,在用户访问一个php页面的时候nginx已将该进程占用,在该进程又发起http请求时,nginx发现这个仅有的进程已被占用而造成阻塞,就这样造成了死锁,一直到超时。

解决办法就是启动多个php-cgi进程,答主给出了一个他写的python管理脚本:spawn-php.py,下载后运行发现找不到win32process模块,于是又到百度搜索win32process安装包,在杨青个人博客上看到了地址,博主也纳闷在百度搜索win32process安装包,总是出现一些不相关的东西,于是就把地址记录了下来。

下载地址:http://sourceforge.net/projects/pywin32/files/

下载对应本地python版本的安装包,安装完成,运行spawn-php.py脚本时遇到了几个小问题,脚本是为python2写的,本地装的是python3.4,所以有两点需要改下:

  1. print作为函数使用,要加上括号
  2. dict没有iteritems属性了,直接使用items属性即可

运行脚本 spawn-php.py 9001 10 启动10个php-cgi进程127.0.0.1:[9001-9010]。

修改nginx配置

 1 upstream php_farm {
 2     server 127.0.0.1:9001 weight=1;
 3     server 127.0.0.1:9002 weight=1;
 4     server 127.0.0.1:9003 weight=1;
 5     server 127.0.0.1:9004 weight=1;
 6     server 127.0.0.1:9005 weight=1;
 7     server 127.0.0.1:9006 weight=1;
 8     server 127.0.0.1:9007 weight=1;
 9     server 127.0.0.1:9008 weight=1;
10     server 127.0.0.1:9009 weight=1;
11     server 127.0.0.1:9010 weight=1;
12 }
13 # ...
14 fastcgi_pass     php_farm;

重新载入nginx配置

1 nginx> nginx.exe -s reload

运行正常!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。