本文首發(fā)于 https://blog.kangxuanpeng.com/post/php-curl_getinfo
背景
工作中經(jīng)常需要對(duì)接第三方 api 醇疼,排查問(wèn)題的時(shí)候需要提供請(qǐng)求詳細(xì)參數(shù)信息途凫。
有時(shí)候可能是認(rèn)證頭 Authorization 有誤,如果不一并記錄獲取提供檢查郊酒,可能會(huì)走很多彎路都不能發(fā)現(xiàn)問(wèn)題所在。
正常 curl 獲取響應(yīng)結(jié)果
$url = 'xxx.kangxuanpeng.com/xx/server';
$data = ['param' => 'test'];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("content-type:application/json"));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$response = curl_exec($ch); // 獲取響應(yīng)內(nèi)容
curl_close($ch);
這樣只能獲取得到 api 響應(yīng)內(nèi)容 body,如果出錯(cuò)了或者是返回非期望內(nèi)容礁阁。需要聯(lián)系提供方排查問(wèn)題,我們可以用 php 的 curl_getinfo 函數(shù)獲取更詳細(xì)的信息族奢。
curl_getinfo() 獲取響應(yīng)詳情
...
$response = curl_exec($ch); // 獲取響應(yīng)內(nèi)容
$info = curl_getinfo($ch);
$error = curl_error($ch);
curl_close($ch);
利用 curl_getinfo() 獲取響應(yīng)詳情姥闭,可以獲得以下內(nèi)容結(jié)構(gòu):
$info = Array
(
[url] => xxx.kangxuanpeng.com/xx/server
[content_type] => application/json;charset=UTF-8
[http_code] => 200
[header_size] => 196
[request_size] => 144
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.266
[namelookup_time] => 0.063
[connect_time] => 0.188
[pretransfer_time] => 0.188
[size_upload] => 8
[size_download] => 33
[speed_download] => 124
[speed_upload] => 30
[download_content_length] => -1
[upload_content_length] => 8
[starttransfer_time] => 0.266
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 161.117.85.239
[certinfo] => Array
(
)
[primary_port] => 80
[local_ip] => 192.168.15.86
[local_port] => 61451
)
curl_error() 可以獲取 http 錯(cuò)誤信息
獲取發(fā)送的請(qǐng)求 header 信息
需要在 curl_exec() 之前設(shè)置
//至關(guān)重要,CURLINFO_HEADER_OUT選項(xiàng)可以拿到請(qǐng)求頭信息
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
$error = curl_error($ch);
curl_close($ch);
這樣執(zhí)行后得到的 info 如下越走,其中 request_header 為請(qǐng)求的 header 信息:
$info = Array
(
[url] => xxx.kangxuanpeng.com/xx/server
[content_type] => application/json;charset=UTF-8
[http_code] => 200
[header_size] => 196
[request_size] => 144
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.218
[namelookup_time] => 0
[connect_time] => 0.125
[pretransfer_time] => 0.125
[size_upload] => 8
[size_download] => 33
[speed_download] => 151
[speed_upload] => 36
[download_content_length] => -1
[upload_content_length] => 8
[starttransfer_time] => 0.218
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 161.117.85.239
[certinfo] => Array
(
)
[primary_port] => 80
[local_ip] => 192.168.15.86
[local_port] => 61756
[request_header] => POST /xx/server HTTP/1.1
Host: xxx.kangxuanpeng.com
Accept: */*
content-type:application/json
Content-Length: 8
)
PS: 如果 api 是根據(jù) http 狀態(tài)來(lái)區(qū)分執(zhí)行結(jié)果的話棚品,可以選擇不接收響應(yīng)體靠欢,可以節(jié)省帶寬以及時(shí)間。
// 是否不需要響應(yīng)的正文,為了節(jié)省帶寬及時(shí)間,在只需要響應(yīng)頭的情況下可以不要正文
curl_setopt($oCurl, CURLOPT_NOBODY, true);