问题总结: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,所以有两点需要改下:
- print作为函数使用,要加上括号
- 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
运行正常!