PHP卷曲超时,但CLI卷曲作品(PHP CURL timing out but CLI CURL

2019-08-03 21:00发布

我看到与PHP应用程序我建立一个非常奇怪的问题。

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

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

服务器与PHP 5.4.9运行Apache 2.4.2的FCGI模块时一切正常。

然后我删除Apache和Nginx的安装,1.2.5(窗口建设)。 我得到了名为php-cgi.exe作为服务运行,一切似乎很好地工作。

问题是,从卷曲呼叫sometestsite.comendpoint.sometestsite.com以前工作会超时。

然后我感动的是一段代码本身来进行测试一个小型的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卷曲(通过GIT中的Bash)相同的请求,它工作正常:

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

这是很奇怪的PHP是完全一样的版本,并且具有相同的配置使用的Apache时。

我不知道这是否是一个Web服务器的配置问题,或者与PHP的CURL有问题呢。

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

Answer 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不能在Windows工作 (为5.4.9)。 FPM是坐落在背景和管理产卵和PHP程序的查杀处理请求时一个整洁的小程序经理。

因为这是不可能的,在Windows上,我们只能服务于一个时间1个请求,类似于此经历的问题 。

在我的情况下,会发生以下情况:在我的应用程序中调用一个页面sometestsite.com这使得一个呼叫php-cgi.exe127.0.0.1:9000 。 在内部,卷曲请求调用页面endpoint.sometestsite.com 。 然而,我们无法产卵任何新的PHP进程服务于第二次请求。 原始PHP-cgi.exe文件是由服务正在运行CURL请求的请求封锁。 因此,我们有一个僵局,一切都那么超时。

我使用的解决方案(这是相当多的黑客攻击)是使用此python脚本产卵10个PHP进程。

然后,使用在nginx的上游块(按照文档的脚本)来告诉nginx的有可用10个处理。

事情再完美工作。

话虽如此,请永远不要在生产中使用这个(你可能会更好过在Linux上运行的Nginx和PHP-FPM反正)。 如果你有一个繁忙的网站,10个进程可能是不够的。 但是,它可能很难知道有多少进程需要。

但是,如果你坚持在Windows上运行使用PHP nginx的,可以考虑在Cygwin运行PHP-FPM按照本教程 。



Answer 2:

要确保你在与用于运行CGI进程相同的用户控制台运行的脚本。 如果他们不一样 - 他们可能有不同的权限。 对我来说,问题是在禁止对CGI进程的所有者开放外部连接的防火墙规则。



文章来源: PHP CURL timing out but CLI CURL works