[英]PHP CURL timing out but CLI CURL works
我正在构建的PHP应用程序遇到一个非常奇怪的问题。
我的开发服务器(Windows 7 64位) sometestsite.com
和endpoint.sometestsite.com
上有2个虚拟主机。
在hosts
文件中,我将sometestsite.com
和endpoint.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.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处理程序,并收到响应。
问题: 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.