我正在开发一个使用Dropbox SDK进行某些操作的网页。大多数情况是通过CLI发生的,但是必须在浏览器中完成一件事。我偶然发现了一个有趣的问题。
$dbxClient = new dbx\Client($accountToken, 'xxx/' . VERSION);
$folderMetadata = $dbxClient->getMetadataWithChildren("/");
运行此代码在CLI中工作正常。但是,在浏览器中运行它却得到了502。莫名其妙,我启动了xdebug并跟踪了出现问题的位置。我发现,Dropbox的curl调用是造成它的原因,所以我写了一个小示例脚本来查看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);
无效。
我应该怎么做才能找出原因,为什么会发生以及如何解决?
系统信息:
如此...经过大量调查,我终于找到了解决方案。希望这对将来的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
瞧,行得通!我不知道为什么会这样,但是确实以根“修复”它的方式运行它。
我希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句