繁体   English   中英

PHP CURL超时,但CLI CURL有效

[英]PHP CURL timing out but CLI CURL works

我正在构建的PHP应用程序遇到一个非常奇怪的问题。

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

hosts文件中,我将sometestsite.comendpoint.sometestsite.com配置为指向127.0.0.1

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

然后,我删除了Apache,并安装了nginx-1.2.5(Windows构建)。 我将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与使用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处理程序,并收到响应。

问题: PHP-FPM在Windows上不起作用 (从5.4.9开始)。 FPM是一个精巧的小流程管理器,它位于后台,并在处理请求时管理PHP进程的产生和终止。

由于这是不可能的,因此在Windows上,我们一次只能处理1个请求,类似于此处遇到问题

以我sometestsite.com ,将发生以下情况:在sometestsite.com应用程序中调用一个页面,该页面在127.0.0.1:9000上调用php-cgi.exe sometestsite.com 在内部,一个CURL请求调用了endpoint.sometestsite.com上的一个页面。 但是,我们无法产生任何新的PHP进程来满足第二个请求。 通过为运行CURL请求的请求提供服务,可阻止原始php-cgi.exe。 因此,我们陷入僵局,然后一切都超时了。

我使用的解决方案(几乎是一种技巧)是使用此python脚本生成10个PHP进程。

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

事情然后完美地进行了。

话虽如此,请永远不要在生产环境中使用它(无论如何,最好还是在Linux上运行nginx和php-fpm)。 如果站点繁忙,则10个进程可能不够。 但是,可能很难知道您需要多少个过程。

但是,如果您确实坚持在Windows上使用php运行nginx,请考虑按照本教程在Cygwin中运行PHP-FPM。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM