php - Curl 不适用于 Nginx 和本地主机上的 PHP

标签 php ssl curl nginx wpn-xm

当我通过 SSL(通过 WPN-XM 在 Windows 上运行 nginx 1.9.4)将来自本地 PHP 脚本的 Curl 请求发送到本地服务器时,浏览器将“等待”直到出现 504 错误。 PHP-fpm 可能已经死了,因为 Web 服务器没有处理任何其他请求。

当我向生产服务器发送相同的请求时,它工作正常。

当我从命令行发送 Curl 请求时,它就起作用了。

当我在网络浏览器中打开最终资源时,它就可以工作了。

我花了 4 个小时在谷歌上搜索和阅读 Stac Owerflow,但没有发现任何其他情况。

谢谢!


<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://webserver.local/resource");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // just on local
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // just on local
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
$response = curl_exec($ch);

最佳答案

此脚本不适用于 WPN-XM v0.8.6 的默认配置, 因为只有一个 php-cgi 进程在后台监听,但您的示例需要(至少)其中两个。执行 curl 请求的脚本已经使用了 php-cgi,因此 Nginx 无法将其转发给 php-cgi。这意味着您将首先遇到一个带有加载指示器的空白页面,然后连接超时。

潜在的问题是 php-cgi 不会自动生成新进程(需要时)。这个问题在这里讨论:https://github.com/WPN-XM/WPN-XM/issues/323

有两种解决方法:

2016 年 3 月更新:

To solve the situation for the WPN-XM stack i've added php-cgi-spawn\spawn.exe by default. This allows to spawn multiple PHP daemons. The spawner will be used in PHP version below v7.1.

PHP v7.1 will have this solution implemented and provide better FCGI MultiPlexing out-of-the-box.


spawn-fcgi

第一个解决方案是修改start.bat。您只需将 spawn-fcgi 放在 php-cgi 前面,如下所示:

spawn-fcgi -f "%_dir%\php-cgi.exe"-a 127.0.0.1 -p 9100 -C 6 -F 4 -P "%_dir%..\temp\php.pid "

我不知道这个工具藏在哪里,也许某处有一个独立的下载,但它可能是 lighttpd windows 发行版的一部分。 我想我将从源代码编译它并使其可用于 WPN-XM。

php 上游池

第二个解决方案需要两个小步骤来启动和运行 PHP 工作池。

  • 第一步是修改 start.bat 文件以启动多个 php-cgi 守护进程,每个守护进程监听不同的端口。我们添加了更多的 php-cgi 启动:

    :start-php
        echo Starting PHP FastCGI...
    
        set PHP_FCGI_MAX_REQUESTS=0
        set PHP_FCGI_CHILDREN=4
    
        %HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9100 -c %~dp0bin\php\php.ini
        %HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9101 -c %~dp0bin\php\php.ini
        %HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9102 -c %~dp0bin\php\php.ini
        %HIDECONSOLE% %~dp0bin\php\php-cgi.exe -b 127.0.0.1:9103 -c %~dp0bin\php\php.ini
    
  • 下一步是修改 server\bin\nginx\conf\nginx.conf 并激活 php_pool,而不是使用单个上游。

    只需查找 fastcgi_pass php; 并将其更改为 fastcgi_pass php_pool;

此更改将激活以下已定义的上游池:

upstream php_pool {
    server 127.0.0.1:9100 weight=1 max_fails=3 fail_timeout=20s;
    server 127.0.0.1:9101 weight=1 max_fails=3 fail_timeout=20s;
    server 127.0.0.1:9102 weight=1 max_fails=3 fail_timeout=20s;
    server 127.0.0.1:9103 weight=1 max_fails=3 fail_timeout=20s;
}

就是这样。

运行 start.bat 然后您的“curl post to localhost”示例应该可以工作了。

关于php - Curl 不适用于 Nginx 和本地主机上的 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33024579/

相关文章:

javascript - 使用javascript隐藏或显示多个表

php/mysql select-这是一个简单的

php - Preg 使用回调替换图像 src

php - 在 SSL/TLS 协商完成之前开始处理?

ssl - 信息或不安全的 ssl 问题只有一页

curl - Slack提供的cURL命令无法发布内嵌json

php - 尝试连接数据库时出错

image - HTTPS 和图像

php - 从同一页面上的外部网站获取表单结果

python - 如何通过 curl 发送包含 json 对象和图像文件的多部分/表单数据?我如何使用 Django Rest Framework 来处理它?