2012-12-11 65 views
2

我看到一个非常奇怪的问题,我正在构建一个PHP应用程序。PHP CURL超时但CLI CURL工程

我在我的开发服务器(Windows 7 64位)sometestsite.comendpoint.sometestsite.com上有2个虚拟主机。

在我的hosts文件中,我配置了sometestsite.comendpoint.sometestsite.com指向127.0.0.1

当服务器使用PHP 5.4.9作为fcgi模块运行Apache 2.4.2时,一切正常。

然后我删除了Apache并安装了nginx-1.2.5(windows build)。我得到了php-cgi.exe作为服务运行,并且一切似乎都很好。

问题是从以前工作的sometestsite.comendpoint.sometestsite.com的CURL调用将超时。

然后我感动的是一段代码本身的一个小PHP文件来进行测试:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://endpoint.sometestsite.com/test'); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('provider' => urlencode('provider'), 
'key' => urlencode('asdf'))); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

//Execute and get the data back 
$result = curl_exec($ch); 

var_dump($result); 

这是我收到的PHP日志:

PHP Fatal error: Maximum execution time of 30 seconds exceeded in D:\www\test5.php on line 22 
PHP Stack trace: 
PHP 1. {main}() D:\www\test5.php:0 

但是,如果我跑使用CLI CURL(通过Git Bash)的相同请求,它工作正常:

$ curl -X POST 'http://endpoint.sometestsite.com/test' -d'provider=provider&key=asdf' 
{"test": "OK"} 

这很奇怪,因为PHP是e xactly相同的版本,并具有与使用Apache时相同的配置。

我不确定这是Web服务器配置问题还是PHP CURL的问题。

任何人都可以提供一些见解/过去的经验,为什么发生这种情况?

+0

你能告诉我们D:\ www \ test5.php的第22行是什么吗? – Sherif

+0

@GoogleGuy:第22行实际上是// //执行并获取数据(我在CURL请求之前有一些其他代码,但它们只回显出一些字符串)。所以看起来'curl_exec()'超时。 – F21

+0

对,这是你问题的一个重要部分。将它包含在你的代码中会对你有帮助,因为它是导致错误的原因。 – Sherif

回答

1

Nginx不会为你产生你的php-cgi.exe进程。如果你和我一样来自Apache并使用mod_fcgid,则会发现系统中有许多php-cgi.exe进程。

因为Nginx并没有为你产生PHP进程,所以你需要自己启动进程。在我的情况下,我有php-cgi.exe -b 127.0.0.1:9000自动作为服务运行。然后Nginx将PHP的所有请求推送到PHP处理程序并接收响应。

问题:PHP-FPM does not work on windows(截至5.4.9)。 FPM是一个简洁的小程序管理器,位于后台,处理请求时管理PHP进程的产卵和查杀。

因为这是不可能的,所以在Windows上,我们一次只能提供1个请求,类似于problem experienced here

在我的情况下,会发生以下情况:在我的应用程序sometestsite.com上拨打一个页面,拨打电话php-cgi.exe,电话号码127.0.0.1:9000。在内部,一个CURL请求调用一个页面endpoint.sometestsite.com。但是,我们无法产生任何新的PHP进程来处理第二个请求。通过提供运行CURL请求的请求来阻止原始的php-cgi.exe。所以,我们陷入僵局,一切都超时了。

我使用的解决方案(这几乎是一个黑客)是使用这个python script来产生10个PHP进程。

然后,您使用nginx中的上游块(根据脚本的文档)告诉nginx有10个进程可用。

事情然后完美的工作。尽管如此,请不要在生产中使用它(你可能更适合在Linux上运行nginx和php-fpm)。如果你有一个繁忙的网站,10个流程可能不够。但是,很难知道您需要多少个进程。

但是,如果您坚持在Windows上运行带有php的nginx,请考虑在Cygwin中按照this tutorial运行PHP-FPM。

0

请确保您在用于运行cgi进程的同一用户的控制台上运行脚本。如果它们不相同 - 它们可能具有不同的权限。对我来说,问题出在防火墙规则中,不允许cgi进程所有者打开外部连接。