Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP CURL超时,但CLI CURL正常工作_Php_Curl_Nginx_Timeout - Fatal编程技术网

PHP CURL超时,但CLI CURL正常工作

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

我看到我正在构建的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 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中,它只是超时:(