PHP CURL超时,但CLI CURL正常工作
我看到我正在构建的PHP应用程序出现了一个非常奇怪的问题 我的开发服务器(windows 7 64位)上有两个虚拟主机PHP CURL超时,但CLI CURL正常工作,php,curl,nginx,timeout,Php,Curl,Nginx,Timeout,我看到我正在构建的PHP应用程序出现了一个非常奇怪的问题 我的开发服务器(windows 7 64位)上有两个虚拟主机sometestsite.com和endpoint.sometestsite.com 在我的hosts文件中,我将sometestsite.com和endpoint.sometestsite.com配置为指向127.0.0.1 当服务器使用PHP5.4.9作为fcgi模块运行Apache2.4.2时,一切正常 然后我删除了Apache并安装了nginx-1.2.5(windows
sometestsite.com
和endpoint.sometestsite.com
在我的hosts
文件中,我将sometestsite.com
和endpoint.sometestsite.com
配置为指向127.0.0.1
当服务器使用PHP5.4.9作为fcgi模块运行Apache2.4.2时,一切正常
然后我删除了Apache并安装了nginx-1.2.5(windows build)。我让php-cgi.exe作为一个服务运行,一切似乎都很好
问题是,以前有效的从sometestsite.com
到endpoint.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与使用Apache时的版本和配置完全相同
我不确定这是web服务器配置问题还是PHP的CURL问题
有人能提供一些见解/过去的经验来解释为什么会发生这种情况吗?Nginx不会为您生成php-cgi.exe进程。如果您像我一样来自Apache并使用mod_fcgid,您会发现系统中有许多php-cgi.exe进程 因为Nginx不会为您生成PHP进程,所以您需要自己启动该进程。在我的例子中,我有
php-cgi.exe-b 127.0.0.1:9000
作为服务自动运行。然后,Nginx将对PHP的所有请求推送到PHP处理程序并接收响应
问题:(从5.4.9开始)。FPM是一个整洁的小型进程管理器,它位于后台,在处理请求时管理PHP进程的生成和终止
因为这是不可能的,在Windows上,我们一次只能处理一个请求,类似于
在我的例子中,会发生以下情况:在sometestsite.com
上调用我的应用程序中的一个页面,该页面在127.0.0.1:9000
上调用php cgi.exe
。在内部,CURL请求调用endpoint.sometestsite.com
上的页面。但是,我们无法生成任何新的PHP进程来服务第二个请求。原始的php-cgi.exe被运行CURL请求的请求阻塞。所以,我们陷入了僵局,然后一切都超时了
我使用的解决方案(这几乎是一种黑客行为)是使用它生成10个PHP进程
然后在nginx中使用一个上游块(根据脚本文档)告诉nginx有10个进程可用
然后一切都很顺利
话虽如此,请不要在生产中使用它(无论如何,在Linux上运行nginx和php-fpm可能会更好)。如果您有一个繁忙的站点,10个进程可能不够。但是,很难知道您需要多少个进程
但是,如果您坚持在Windows上使用PHP运行NGINX,请考虑在CygWin中运行PHP FPM,如
< P>确保您从运行RCGI进程的同一个用户上运行控制台上的脚本。如果它们不相同-它们可能具有不同的权限。对我来说,问题在于防火墙规则不允许为cgi进程的所有者打开外部连接。你能告诉我们D:\www\test5.php的第22行是什么吗?@GoogleGuy:第22行实际上是//执行并取回数据
(在CURL请求之前,我还有一些其他代码,但它们只回显一些字符串)。所以看起来curl\u exec()
超时了。对,这是问题的一个重要部分。在代码中包含这一点会对您有所帮助,因为这是导致错误的原因。如果exec导致脚本超时,则可能是远程主机(您的Web服务器)没有响应请求(即,它可能正在另一个端口上侦听,或根本没有侦听)或。。。您的主机文件未更新。可能需要重新启动以修复此问题。我认为这可能是原因,但这并不能真正解释为什么使用CURL over CLI运行请求可以完美工作,而在PHP中,它只是超时:(