<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>curl on TripleZ&#39;s Blog</title>
    <link>https://blog.triplez.cn/tags/curl/</link>
    <description>Recent content in curl on TripleZ&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 11 May 2020 15:35:41 +0000</lastBuildDate><atom:link href="https://blog.triplez.cn/tags/curl/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用 curl 来分析请求各个阶段的耗时</title>
      <link>https://blog.triplez.cn/posts/using-curl-analyzing-time-cost-at-request-diff-phases/</link>
      <pubDate>Mon, 11 May 2020 15:35:41 +0000</pubDate>
      
      <guid>https://blog.triplez.cn/posts/using-curl-analyzing-time-cost-at-request-diff-phases/</guid>
      <description>也可以用 httpstats 哦~</description>
      <content:encoded><![CDATA[<h2 id="how">How</h2>
<p>这个功能用到的是 <code>curl</code> 的 <code>-w</code> 选项，让我们来先看看 <code>curl</code> 的 man page：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-1">1</a>
</span><span class="lnt" id="hl-0-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-2">2</a>
</span><span class="lnt" id="hl-0-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-3">3</a>
</span><span class="lnt" id="hl-0-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-4">4</a>
</span><span class="lnt" id="hl-0-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-5">5</a>
</span><span class="lnt" id="hl-0-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-6">6</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">-w, --write-out &lt;format&gt;
</span></span><span class="line"><span class="cl">       Make curl display information on stdout after a completed transfer. The format is a string that may contain lain text mixed with any number of variables. The format can be specified as a literal &#34;string&#34;, or you can have curl read the format from a file with &#34;@filename&#34; and to tell curl to read the format from stdin you  write &#34;@-&#34;.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">       The variables present in the output format will be substituted by the value or text that curl thinks fit, as de‐ scribed below. All variables are specified as %{variable_name} and to output a normal % you just write  them  as %%. You can output a newline by using \n, a carriage return with \r and a tab space with \t.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">       The output will be written to standard output, but this can be switched to standard error by using %{stderr}.使用 curl 命令分析请求的耗时情况
</span></span></code></pre></td></tr></table>
</div>
</div><p>下面的内容就是各种内置变量了，我们可以通过这些变量的值来一窥请求的真实信息。</p>
<p>以下有一个“广为流传”的格式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-1-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-1">1</a>
</span><span class="lnt" id="hl-1-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-2">2</a>
</span><span class="lnt" id="hl-1-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-3">3</a>
</span><span class="lnt" id="hl-1-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-4">4</a>
</span><span class="lnt" id="hl-1-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-5">5</a>
</span><span class="lnt" id="hl-1-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-6">6</a>
</span><span class="lnt" id="hl-1-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-7">7</a>
</span><span class="lnt" id="hl-1-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-8">8</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">    time_namelookup:  %{time_namelookup}\n
</span></span><span class="line"><span class="cl">       time_connect:  %{time_connect}\n
</span></span><span class="line"><span class="cl">    time_appconnect:  %{time_appconnect}\n
</span></span><span class="line"><span class="cl">      time_redirect:  %{time_redirect}\n
</span></span><span class="line"><span class="cl">   time_pretransfer:  %{time_pretransfer}\n
</span></span><span class="line"><span class="cl"> time_starttransfer:  %{time_starttransfer}\n
</span></span><span class="line"><span class="cl">                    ----------\n
</span></span><span class="line"><span class="cl">         time_total:  %{time_total}\n
</span></span></code></pre></td></tr></table>
</div>
</div><p>将如上内容写至 <code>curl-format</code> 文件中，然后在当前目录运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-2-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ curl -w @curl-format -o /dev/null -s -L http://triplez.cn
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<ul>
<li>
<p><code>-w @curl-format</code> ：使用 <code>curl-format</code> 文件模板进行输出。</p>
</li>
<li>
<p><code>-o /dev/null</code> ：忽略输出内容。</p>
</li>
<li>
<p><code>-s</code> ：不输出多余信息。</p>
</li>
<li>
<p><code>-L</code> ：支持跳转（如 HTTP 跳转至 HTTPS）。</p>
</li>
</ul>
</blockquote>
<p>就会看到像这样的输出：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-3-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-1">1</a>
</span><span class="lnt" id="hl-3-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-2">2</a>
</span><span class="lnt" id="hl-3-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-3">3</a>
</span><span class="lnt" id="hl-3-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-4">4</a>
</span><span class="lnt" id="hl-3-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-5">5</a>
</span><span class="lnt" id="hl-3-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-6">6</a>
</span><span class="lnt" id="hl-3-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-7">7</a>
</span><span class="lnt" id="hl-3-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-8">8</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">    time_namelookup:  0.001931
</span></span><span class="line"><span class="cl">       time_connect:  0.032337
</span></span><span class="line"><span class="cl">    time_appconnect:  0.120072
</span></span><span class="line"><span class="cl">      time_redirect:  0.000000
</span></span><span class="line"><span class="cl">   time_pretransfer:  0.120124
</span></span><span class="line"><span class="cl"> time_starttransfer:  0.151386
</span></span><span class="line"><span class="cl">                    ----------
</span></span><span class="line"><span class="cl">         time_total:  0.152068
</span></span></code></pre></td></tr></table>
</div>
</div><p>这些变量的意义是：</p>
<ul>
<li><code>time_namelookup</code>：（从请求开始到）DNS 域名解析的耗时。</li>
<li><code>time_connect</code>：（从请求开始到）TCP 连接建立耗时。</li>
<li><code>time_appconnect</code>：（从请求开始到）SSL/SSH 等上层协议建立连接的耗时，比如 connect/handshake 耗时（从此处也可看出，最后还是请求了 <code>https://triplez.cn</code> ，否则 HTTP 不会产生 <code>time_appconnect</code> 的耗时。</li>
<li><code>time_redirect</code>：（从请求开始到）最后一个请求事务的耗时。</li>
<li><code>time_pretransfer</code>：（从请求开始到）响应开始传输的耗时。</li>
<li><code>time_starttransfer</code>：（从请求开始到）第一个字节将要传输的耗时。</li>
<li><code>time_total</code>：这次请求的总耗时。</li>
</ul>
<blockquote>
<p><code>time_*</code> 这些变量代表的是到某个阶段结束后计时器的值，并不是某个阶段的耗时。</p>
<p>若希望获得某个阶段的耗时，需要使用 <code>time_*</code> 变量值进行作差，可用 <a href="https://www.nixops.me/articles/curl-http-timing.html">@will 在此文中提供的脚本</a> 来实现。</p>
<details>
<summary>使用 curl 来获取各阶段耗时的脚本</summary>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-4-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-1"> 1</a>
</span><span class="lnt" id="hl-4-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-2"> 2</a>
</span><span class="lnt" id="hl-4-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-3"> 3</a>
</span><span class="lnt" id="hl-4-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-4"> 4</a>
</span><span class="lnt" id="hl-4-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-5"> 5</a>
</span><span class="lnt" id="hl-4-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-6"> 6</a>
</span><span class="lnt" id="hl-4-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-7"> 7</a>
</span><span class="lnt" id="hl-4-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-8"> 8</a>
</span><span class="lnt" id="hl-4-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-9"> 9</a>
</span><span class="lnt" id="hl-4-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-10">10</a>
</span><span class="lnt" id="hl-4-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-11">11</a>
</span><span class="lnt" id="hl-4-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-12">12</a>
</span><span class="lnt" id="hl-4-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-13">13</a>
</span><span class="lnt" id="hl-4-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-14">14</a>
</span><span class="lnt" id="hl-4-15"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-15">15</a>
</span><span class="lnt" id="hl-4-16"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-16">16</a>
</span><span class="lnt" id="hl-4-17"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-17">17</a>
</span><span class="lnt" id="hl-4-18"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-18">18</a>
</span><span class="lnt" id="hl-4-19"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-19">19</a>
</span><span class="lnt" id="hl-4-20"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-20">20</a>
</span><span class="lnt" id="hl-4-21"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-21">21</a>
</span><span class="lnt" id="hl-4-22"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-22">22</a>
</span><span class="lnt" id="hl-4-23"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-23">23</a>
</span><span class="lnt" id="hl-4-24"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-24">24</a>
</span><span class="lnt" id="hl-4-25"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-25">25</a>
</span><span class="lnt" id="hl-4-26"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-26">26</a>
</span><span class="lnt" id="hl-4-27"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-27">27</a>
</span><span class="lnt" id="hl-4-28"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-28">28</a>
</span><span class="lnt" id="hl-4-29"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-29">29</a>
</span><span class="lnt" id="hl-4-30"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-30">30</a>
</span><span class="lnt" id="hl-4-31"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-31">31</a>
</span><span class="lnt" id="hl-4-32"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-32">32</a>
</span><span class="lnt" id="hl-4-33"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-33">33</a>
</span><span class="lnt" id="hl-4-34"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-34">34</a>
</span><span class="lnt" id="hl-4-35"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-35">35</a>
</span><span class="lnt" id="hl-4-36"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-36">36</a>
</span><span class="lnt" id="hl-4-37"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-37">37</a>
</span><span class="lnt" id="hl-4-38"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-38">38</a>
</span><span class="lnt" id="hl-4-39"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-39">39</a>
</span><span class="lnt" id="hl-4-40"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-40">40</a>
</span><span class="lnt" id="hl-4-41"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-41">41</a>
</span><span class="lnt" id="hl-4-42"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-42">42</a>
</span><span class="lnt" id="hl-4-43"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-43">43</a>
</span><span class="lnt" id="hl-4-44"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-44">44</a>
</span><span class="lnt" id="hl-4-45"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-45">45</a>
</span><span class="lnt" id="hl-4-46"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-46">46</a>
</span><span class="lnt" id="hl-4-47"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-47">47</a>
</span><span class="lnt" id="hl-4-48"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-48">48</a>
</span><span class="lnt" id="hl-4-49"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-49">49</a>
</span><span class="lnt" id="hl-4-50"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-50">50</a>
</span><span class="lnt" id="hl-4-51"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-51">51</a>
</span><span class="lnt" id="hl-4-52"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-52">52</a>
</span><span class="lnt" id="hl-4-53"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-53">53</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1">#author : will</span>
</span></span><span class="line"><span class="cl"><span class="c1">#website: https://www.nixops.me</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">Default_URL</span><span class="o">=</span>https://www.nixops.me
</span></span><span class="line"><span class="cl"><span class="nv">URL</span><span class="o">=</span><span class="si">${</span><span class="nv">1</span><span class="k">:-</span><span class="nv">$Default_URL</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">Result</span><span class="o">=</span><span class="sb">`</span>curl -o /dev/null -s <span class="nv">$URL</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        -w <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        <span class="s1">&#39;time_namelookup=%{time_namelookup}
</span></span></span><span class="line"><span class="cl"><span class="s1">time_connect=%{time_connect}
</span></span></span><span class="line"><span class="cl"><span class="s1">time_appconnect=%{time_appconnect}
</span></span></span><span class="line"><span class="cl"><span class="s1">time_redirect=%{time_redirect}
</span></span></span><span class="line"><span class="cl"><span class="s1">time_pretransfer=%{time_pretransfer}
</span></span></span><span class="line"><span class="cl"><span class="s1">time_starttransfer=%{time_starttransfer}
</span></span></span><span class="line"><span class="cl"><span class="s1">time_total=%{time_total}
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">declare</span> <span class="nv">$Result</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">curl_timing<span class="o">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\e[92mcURL Timing: \e[0m\n&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> i in <span class="nv">$Result</span>
</span></span><span class="line"><span class="cl">    <span class="k">do</span>  
</span></span><span class="line"><span class="cl">            <span class="nv">IFS</span><span class="o">=</span><span class="s1">&#39;=&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %10s \n&#34;</span> <span class="nv">$i</span>
</span></span><span class="line"><span class="cl">    <span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">stat_timing<span class="o">(){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nv">Result_TCP</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">&#34;%.6f&#34;</span> <span class="k">$(</span><span class="nb">echo</span> <span class="nv">$time_connect</span> - <span class="nv">$time_namelookup</span> <span class="p">|</span>bc -l<span class="k">)</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">    <span class="nv">Result_TLS</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">&#34;%.6f&#34;</span> <span class="k">$(</span><span class="nb">echo</span> <span class="nv">$time_appconnect</span> - <span class="nv">$time_connect</span> <span class="p">|</span>bc -l<span class="k">)</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">    <span class="nv">Result_Server</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">&#34;%.6f&#34;</span> <span class="k">$(</span><span class="nb">echo</span> <span class="nv">$time_starttransfer</span> - <span class="nv">$time_pretransfer</span> <span class="p">|</span>bc -l<span class="k">)</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">    <span class="nv">Result_TTFB</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">&#34;%.6f&#34;</span> <span class="k">$(</span><span class="nb">echo</span> <span class="nv">$time_starttransfer</span> - <span class="nv">$time_appconnect</span> <span class="p">|</span>bc -l<span class="k">)</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">    <span class="nv">Result_Transfer</span><span class="o">=</span><span class="sb">`</span><span class="nb">printf</span> <span class="s2">&#34;%.6f&#34;</span> <span class="k">$(</span><span class="nb">echo</span> <span class="nv">$time_total</span> - <span class="nv">$time_starttransfer</span> <span class="p">|</span>bc -l<span class="k">)</span><span class="sb">`</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\n\e[92mResource Timing: \e[0m\n&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %.6f \n&#34;</span> <span class="s2">&#34;DNS Lookup&#34;</span> <span class="nv">$time_namelookup</span>
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %.6f \n&#34;</span> <span class="s2">&#34;TCP Connection&#34;</span> <span class="nv">$Result_TCP</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">if</span>  <span class="o">[</span> <span class="sb">`</span><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$time_appconnect</span><span class="s2"> == 0&#34;</span><span class="p">|</span>bc<span class="sb">`</span> -eq <span class="m">0</span> <span class="o">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %.6f \n&#34;</span> <span class="s2">&#34;TLS Handshake&#34;</span> <span class="nv">$Result_TLS</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %.6f \n&#34;</span> <span class="s2">&#34;Server Processing&#34;</span> <span class="nv">$Result_Server</span>
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %.6f \n&#34;</span> <span class="s2">&#34;TTFB&#34;</span> <span class="nv">$Result_TTFB</span>
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %.6f \n&#34;</span> <span class="s2">&#34;Content Transfer&#34;</span> <span class="nv">$Result_Transfer</span>
</span></span><span class="line"><span class="cl">    <span class="nb">printf</span> <span class="s2">&#34;\e[96m%18s \e[0m: %.6f \n&#34;</span> <span class="s2">&#34;Finish&#34;</span> <span class="nv">$time_total</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">curl_timing
</span></span><span class="line"><span class="cl">stat_timing 
</span></span></code></pre></td></tr></table>
</div>
</div></details>
</blockquote>
<p>除此之外，还可用 Cloudflare 在 <a href="https://blog.cloudflare.com/a-question-of-timing/">此篇博文</a> 中提供的图表来简化理解。</p>
<figure class="align-center ">
    <img loading="lazy" src="https://blog.cloudflare.com/content/images/2018/10/Screen-Shot-2018-10-16-at-14.51.29-1.png#center"
         alt="cURL 中请求各阶段耗时图"/> <figcaption>
            cURL 中请求各阶段耗时图
        </figcaption>
</figure>

<h2 id="one-more-thing">One more thing&hellip;</h2>
<p><a href="https://github.com/reorx">reorx</a> 写了个 Python 的小工具 <a href="https://github.com/reorx/httpstat">httpstat</a>，让命令行分析请求耗时更加直观。通过以下命令即可安装：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-5-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-5-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ pip install httpstat
</span></span></code></pre></td></tr></table>
</div>
</div><p>让我们来试一下：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-6-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-1"> 1</a>
</span><span class="lnt" id="hl-6-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-2"> 2</a>
</span><span class="lnt" id="hl-6-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-3"> 3</a>
</span><span class="lnt" id="hl-6-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-4"> 4</a>
</span><span class="lnt" id="hl-6-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-5"> 5</a>
</span><span class="lnt" id="hl-6-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-6"> 6</a>
</span><span class="lnt" id="hl-6-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-7"> 7</a>
</span><span class="lnt" id="hl-6-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-8"> 8</a>
</span><span class="lnt" id="hl-6-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-9"> 9</a>
</span><span class="lnt" id="hl-6-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-10">10</a>
</span><span class="lnt" id="hl-6-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-11">11</a>
</span><span class="lnt" id="hl-6-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-12">12</a>
</span><span class="lnt" id="hl-6-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-13">13</a>
</span><span class="lnt" id="hl-6-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-14">14</a>
</span><span class="lnt" id="hl-6-15"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-15">15</a>
</span><span class="lnt" id="hl-6-16"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-16">16</a>
</span><span class="lnt" id="hl-6-17"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-17">17</a>
</span><span class="lnt" id="hl-6-18"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-18">18</a>
</span><span class="lnt" id="hl-6-19"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-19">19</a>
</span><span class="lnt" id="hl-6-20"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-20">20</a>
</span><span class="lnt" id="hl-6-21"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-21">21</a>
</span><span class="lnt" id="hl-6-22"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-22">22</a>
</span><span class="lnt" id="hl-6-23"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-23">23</a>
</span><span class="lnt" id="hl-6-24"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-24">24</a>
</span><span class="lnt" id="hl-6-25"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-25">25</a>
</span><span class="lnt" id="hl-6-26"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-26">26</a>
</span><span class="lnt" id="hl-6-27"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-27">27</a>
</span><span class="lnt" id="hl-6-28"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-28">28</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ httpstat -L http://triplez.cn
</span></span><span class="line"><span class="cl">Connected to 123.206.208.167:443 from 192.168.0.10:34372
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">HTTP/1.1 <span class="m">302</span> Found
</span></span><span class="line"><span class="cl">Date: Mon, <span class="m">11</span> May <span class="m">2020</span> 15:24:00 GMT
</span></span><span class="line"><span class="cl">Server: Apache
</span></span><span class="line"><span class="cl">Location: https://triplez.cn/
</span></span><span class="line"><span class="cl">Content-Length: <span class="m">203</span>
</span></span><span class="line"><span class="cl">Content-Type: text/html<span class="p">;</span> <span class="nv">charset</span><span class="o">=</span>iso-8859-1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">HTTP/1.1 <span class="m">200</span> OK
</span></span><span class="line"><span class="cl">Date: Mon, <span class="m">11</span> May <span class="m">2020</span> 15:24:00 GMT
</span></span><span class="line"><span class="cl">Server: Apache
</span></span><span class="line"><span class="cl">Last-Modified: Sun, <span class="m">08</span> Mar <span class="m">2020</span> 07:48:35 GMT
</span></span><span class="line"><span class="cl">ETag: <span class="s2">&#34;7258f-f13-5a0531d213ac0&#34;</span>
</span></span><span class="line"><span class="cl">Accept-Ranges: bytes
</span></span><span class="line"><span class="cl">Content-Length: <span class="m">3859</span>
</span></span><span class="line"><span class="cl">Content-Type: text/html<span class="p">;</span> <span class="nv">charset</span><span class="o">=</span>UTF-8
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Body stored in: /tmp/tmpkeq3ospo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  DNS Lookup   TCP Connection   Server Processing   Content Transfer
</span></span><span class="line"><span class="cl"><span class="o">[</span>    32ms    <span class="p">|</span>      66ms      <span class="p">|</span>       73ms        <span class="p">|</span>        1ms       <span class="o">]</span>
</span></span><span class="line"><span class="cl">             <span class="p">|</span>                <span class="p">|</span>                   <span class="p">|</span>                  <span class="p">|</span>
</span></span><span class="line"><span class="cl">    namelookup:32ms           <span class="p">|</span>                   <span class="p">|</span>                  <span class="p">|</span>
</span></span><span class="line"><span class="cl">                        connect:98ms              <span class="p">|</span>                  <span class="p">|</span>
</span></span><span class="line"><span class="cl">                                      starttransfer:266ms            <span class="p">|</span>
</span></span><span class="line"><span class="cl">                                                                 total:267ms  
</span></span></code></pre></td></tr></table>
</div>
</div><p>从输出上我们就可以很直观地看出来，从 <code>http://triplez.cn</code> 到 <code>https://triplez.cn</code> 中完成了一次 302 跳转，在输出末尾的示意图上我们也可以清楚地看到各阶段的耗时。</p>
<p>Happy hacking :)</p>
<h2 id="references">References</h2>
<ul>
<li><a href="https://cizixs.com/2017/04/11/use-curl-to-analyze-request/">使用 curl 命令分析请求的耗时情况</a></li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
