PHP7 + curl(SSL / TLS)提供502 Bad Gateway

时间:2016-02-27 16:26:32

标签: php ssl curl

我正在开发一个使用Dropbox SDK做一些事情的网页。大多数情况都是通过CLI发生的,但必须在浏览器中完成一件特别的事情。不过,我偶然发现了一个有趣的问题。

$dbxClient = new dbx\Client($accountToken, 'xxx/' . VERSION);
$folderMetadata = $dbxClient->getMetadataWithChildren("/");

运行此代码在CLI中运行良好。然而,在浏览器中运行它会给我一个502.由于困惑,我启动了xdebug并跟踪问题出现的位置。我发现,Dropbox的curl-call导致了它,所以我写了一个小例子脚本来看看,如果curl工作的话。 没有。

<?php
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://example.com"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch); 

    curl_close($ch);
    echo $output;

在浏览器中运行此代码会立即生成502。如果我删除https://或将其设为http://(或在CLI中运行),它可以工作。问题似乎是PHP7 + curl + SSL。添加curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);不起作用。

我该怎么做才能找到,为什么会这样,以及我如何解决它?

系统信息:

  • OS X 10.11.2
  • nginx 1.8.0,通过自制软件安装
  • PHP 7.0.3,通过自制软件安装
  • 卷曲7.43.0,通过自制软件安装
  • OpenSSL 1.0.2f,通过自制软件安装

1 个答案:

答案 0 :(得分:7)

Sooo ......经过大量调查后,我终于找到了解决方案。希望这将有助于未来的Google员工。

第1步:调查正在发生的事情。

由于我使用的是自制软件的php70-package,因此OS X上的目录与Linux有所不同。我需要找到php-fpm.conf。通过检查自制软件创建的homebrew.*.plist文件,我发现它位于/usr/local/etc/php/7.0/php-fpm.conf

在那之后,我找到了二进制文件,幸运的是,它也记录在plist中。对我而言,它在/usr/local/opt/php70/sbin/php-fpm

我修改了配置文件以在/var/log/php-fpm.log中编写日志文件:

log_level = notice
error_log = /var/log/php-fpm.log

我给了/var/log/php-fpm.log chmod 0777(因为我很懒),再次启动php-fpm(launchctl load -w /path/to/php-fpm.plist)并尾随新的日志文件:tail -f /var/log/php-fpm.log

这是我发现的(以及Google员工可能会寻找的):

WARNING: [pool www] child 28580 exited on signal 11 (SIGSEGV) after 1.726773 seconds from start

因此发生了分段错误。

第2步:修复SIGSEGV

使用新发现的信息,我想知道可能是分段错误的原因。我在前几页中找不到任何帮助,但在后面的一页上,我找到了这个链接:https://stackoverflow.com/a/34951784/1486930

它说的是:

I experienced same problem early and fixed it with running php-fpm as root.

You just killed me. Running php-fpm as root just works well! Thanks!!

所以这就是我所做的。我再次停止了php-fpm并以root身份手动运行:

sudo /usr/local/opt/php70/sbin/php-fpm --fpm-config /usr/local/etc/php/7.0/php-fpm.conf

看,它有效!我不知道为什么会这样,但确实以root身份运行它“修复”它。

我希望能有所帮助。