2

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

我的开发服务器(Windows 7 64 位)sometestsite.comendpoint.sometestsite.com.

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

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

然后我删除了 Apache 并安装了 nginx-1.2.5 (windows build)。我让 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 问题。

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

4

2 回答 2

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.exeon 127.0.0.1:9000。在内部,一个 CURL 请求调用endpoint.sometestsite.com. 但是,我们无法生成任何新的 PHP 进程来处理第二个请求。原来的 php-cgi.exe 被服务正在运行 CURL 请求的请求所阻止。所以,我们陷入了僵局,然后一切都超时了。

我使用的解决方案(它几乎是一个 hack)是使用这个python 脚本来生成 10 个 PHP 进程。

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

然后事情就完美了。

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

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

于 2012-12-11T06:09:24.410 回答
0

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

于 2016-12-29T07:52:35.177 回答