平时大家很多地方使用了 php 的 curl 模块,在排查超时问题上有时候方法不当,不能正确的定位超时在哪个阶段,在这里主要是把 curl 模块文档里的一个函数给大家说一下,curl_getinfo 这个函数,先说下发起 curl 请求后的几个关键时间点阶段如下图,

curl请求

根据上面的这个图,大家应该就能明白排查超时定位问题的方向了,这个图里的各个阶段的时间点就可以通过 curl_getinfo 来获得了。

1、直接用 curl_* 自己构造的请求,直接通过 curl_getinfo 就可以获得。

2、通过第三方库 GuzzleHttp 来获得这个时间代码示例

    // $this->initClient = new \GuzzleHttp\Client();
    $response = $this->initClient()->post($this->serverUrl, [
        'form_params' => $formParams,
        'headers' => $headers,
        'timeout' => $this->timeout,
        'connect_timeout' => $this->connectionTimeout,
        'http_errors' => true,
        'debug' => $this->debug,
        // TransferStats 注意这个
        'on_stats' => $this->debug ?  function (TransferStats $stats) {
            print_r($stats->getHandlerStats());
        } : null,
    ]);

具体每个时间段的参数代表的具体含义,大家自行参考文档。

EOT;