-w 的作用
- 完成請求傳輸后,使 curl 在 stdout 上顯示自定義信息
- 格式是一個字符串,可以包含純文本和任意數量的變量
輸出格式
- 輸出格式中的變量會被 curl 用對應的值替換掉
- 所有變量的格式為: %{variable name}
- 要輸出一個普通的 % 只需將它們寫為 %%
- 可以使用 \n、帶 \r 的回車符和帶 \t 的制表符來輸出換行符
- 如果想通過文件來傳入變量,可以用 @filename 的格式
變量列表
content_type(有用)
HTTP 請求的 Content-type
errormsg(有用)
錯誤信息
exitcode
轉移的數字出口代碼,不知道啥來的
filename_effective
curl 執行結果最終寫入的文件名,當加上了 -o、-O 才有意義
ftp_entry_path
初始路徑,當登錄到遠程 FTP 服務器時結束
http_code(有用)
響應碼
http_connect
在對 curl CONNECT 請求的最后響應(來自代理)中找到的數字代碼
http_version
http 版本
local_ip(有用)
ip 地址,可以是ipv4,也可以是ipv6
num_connects
最近傳輸中,新的連接數
num_redirects
在請求中跳轉的次數
redirect_url
當 curl 沒有指定 -L、--location 參數跟隨重定向時,此變量將顯示重定向實將跳轉的實際 URL
remote_ip(有用)
目標服務器的遠程IP,可以是 ipv4、ipv6
remote_port(有用)
目標服務器的遠程端口
response_code(有用)
和 http_code 一樣,都是響應碼
scheme
請求協議,就是 HTTP、HTTPS
size_download
下載的總字節數
size_header
下載頭的總字節數
size_request(有用)
HTTP請求中發送的總字節數
size_upload
上傳的總字節數
speed_download
平均下載速度,每秒字節數
speed_upload
平均上傳速度,每秒字節數
time_namelookup(有用)
DNS 域名解析的耗時,就是把 https://zhihu.com
轉換成 ip 地址的過程
time_connect(有用)
TCP 連接建立的時間,就是三次握手的時間
time_appconnect(有用)
SSL/SSH 等上層協議建立連接的時間,比如 connect/handshake 的時間
time_redirect(有用)
- 在最終事務開始之前,所有重定向步驟(包括名稱查找、連接、預傳輸和傳輸)所用的時間(以秒為單位)
- time_redirect 顯示多個重定向的完整執行時間
time_pretransfer(有用)
從請求開始到響應開始傳輸的時間
time_starttransfer(有用)
- 從請求開始到第一個字節將要傳輸的時間
- 包括預傳輸時間和服務器處理結果所需的時間。
time_total(有用)
這次請求花費的全部時間
url_effective(有用)
- 最后獲取的 URL
- 如果 curl 添加了 -L 且真的重定向之后,這個就很有用了
使用 curl 命令分析請求的耗時情況
實際工作中的問題
某個請求的響應特別慢,那想要分析為什么這個請求慢,到底是哪一步耗時長,應該怎么做?
強大的 curl -w
提供了 7 種 time 變量,上面就能看到
寫一個文件,包含 7 種變量,還能比較好看的格式化輸出
time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_redirect: %{time_redirect}\n time_pretransfer: %{time_pretransfer}\n time_starttransfer: %{time_starttransfer}\n ----------\n time_total: %{time_total}
請求 http
curl -w "@format.txt" -S -s -L -k -o /dev/null http://baidu.com
所有時間都是秒單位
- DNS 解析查詢時間:time_namelookup【 0.004146】
- TCP 建立連接時間:time_connect【0.013002】 - time_namelookup【0.004146】
- 服務器處理時間:time_starttransfer【0.02542】-time_pretransfer【0.013039】
- 內容傳輸時間:time_totle【0.072124】-time_starttransfer【0.02542】
因為不是 https 協議和重定向,所以中間兩個沒有時間
請求 https
curl -w "@format.txt" -S -s -L -k -o /dev/null https://baidu.com
SSL 協議處理時間:time_appconnect【0.042989】 - time_namelookup【 0.008223】