如何使用cURL一次測量請求和響應時間?
cURL支援格式化輸出請求的詳細資訊(請參閱cURL手冊頁的-w、–write out<format>
獲取更多資訊)。
如題,我們將只關注如何知曉cURL請求的時間細節, 下面時間以s為單位。
1. 建立一個文字檔案curl-format.txt, 貼上下面內容
time_namelookup: %{time_namelookup}s\n
time_connect: %{time_connect}s\n
time_appconnect: %{time_appconnect}s\n
time_pretransfer: %{time_pretransfer}s\n
time_redirect: %{time_redirect}s\n
time_starttransfer: %{time_starttransfer}s\n
----------\n
time_total: %{time_total}s\n
2.發起請求
url -w "@curl-format.txt" -o /dev/null -s "http://wordpress.com/"
在windows機器上是curl -w "@curl-format.txt" -o NUL -s "http://wordpress.com/"
旁白解釋
-w "@curl-format.txt"
通知cURL使用格式化的輸出檔案
-o /dev/null
將請求的輸出重定向到/dev/null
-s
通知cURL不顯示進度條
"http://wordpress.com/"
是我們請求的URL,請使用引號包圍(尤其當你的URL包含&查詢字串)
文字輸出
time_namelookup: 0.001s
time_connect: 0.037s
time_appconnect: 0.000s
time_pretransfer: 0.037s
time_redirect: 0.000s
time_starttransfer: 0.092s
----------
time_total: 0.164s
輸出的啥意思呢? 我解釋一下:
- time_namelookup:DNS 域名解析的時候,就是把http://wordpress.com 轉換成ip地址的過程
- time_connect:TCP 連線建立的時間,就是三次握手的時間
- time_appconnect:SSL/SSH等上層協議建立連線的時間,比如 connect/handshake 的時間
- time_pretransfer:從請求開始到響應開始傳輸的時間
- time_starttransfer:從請求開始到第一個位元組將要傳輸的時間
- time_total:這次請求花費的全部時間
製作成Linux/Mac快捷命令(alise 別名)
alias curltime="curl -w \"@$HOME/.curl-format.txt\" -o /dev/null -s "
製作成Linux/Mac 獨立指令碼
指令碼不需要單獨的包含格式化的文字。
在可執行路徑中,建立名為curltime的檔案,貼上下面內容:
#!/bin/bash
curl -w @- -o /dev/null -s "$@" <<'EOF'
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_redirect: %{time_redirect}\n
time_starttransfer: %{time_starttransfer}\n
----------\n
time_total: %{time_total}\n
EOF
製作成windows快捷方式(bat批處理)
把下面的命令寫入curltime.bat:
curl -w "@%~dp0curl-format.txt" -o NUL -s %*
以上手段後,curltime wordpress.org
就可以拿到cURL的請求耗時。
cURL還有一個小技巧,模擬連線/傳輸超時。
連線超時時間用--connect-timeout
引數來指定,資料傳輸的最大允許時間用-m
引數來指定。
連線超時的話,出錯提示形如:
curl: (28) connect() timed out!
資料傳輸的最大允許時間超時的話,出錯提示形如:
curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received