我正在开发一个使用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);
不起作用。
我该怎么做才能找到,为什么会这样,以及我如何解决它?
系统信息:
答案 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身份运行它“修复”它。
我希望能有所帮助。