该问题一般出现在 通过模块 编译安装 导致的版本差异。

采用lnmp, 或者其他面板类的方式安装不太容易出现该问题。

1.问题描述

        运维在安装,php,swoole环境后,项目跑起来,突然发现请求https直接出现段错误。

在调试过程中发现 使用 file_get_contents('https://www.baidu.com') 也是会出现报错,

 但是file_get_contents('https://www.baidu.com/api') 又可以得到一个正确的错误反馈如,404.

2.问题排查思路

        在swoole环境里需要考虑协程的问题,在一键开启协程环境中,使用的http客户端也是不一样,由此在正常环境测试下, file_get_contents('https://www.baidu.com') 是没有问题的。所以基本就是在swoole的客户端请求出现的。

笔者在该代码中使用 GuzzleHttp 库 DefaultHandler使用的 SwooleHandler 

use Yurun\Util\Swoole\Guzzle\SwooleHandler;
use GuzzleHttp\DefaultHandler;

define('APP_ROOT_PATH', dirname(__DIR__));
DefaultHandler::setDefaultHandler(SwooleHandler::class);

在使用 客户端进行请求时,很容易出现的 端错误 带上域名路径后又可以得到正常的错误结果,决定更换为http请求,发现并没有任何问题,既然http请求没有问题,那问题更为清晰明了。

3.解决

        既然确定是由swoole环境请求的https问题导致的,就需要进一步确认是哪一步的问题了。

https只比http 多了 ssl验证,php基本上都是openSSL来验证。

使用命令 `php --ri swoole` 检查swoole模块配置

使用命令 `php --ri openssl` 检查模块配置

发现版本不一致,决定更换swoole扩展的openssl版本,更换后问题即解决

更多推荐