<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 本段代码用于初始化环境,与正文内容无关</span></span><span>
</span><span><span class="hljs-title function_ invoke__">date_default_timezone_set</span></span><span>(</span><span><span class="hljs-string">'UTC'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"准备进行网络延迟测试...\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
<h1>如何使用 gettimeofday 函数进行网络延迟的精准测试?</h1>
<p>在网络编程和性能调优中,测量网络请求的延迟是一个至关重要的任务。PHP 提供了多个时间函数来辅助这一操作,其中 <code>gettimeofday
由于包含了微秒部分,因此可以用来测量两个时间点之间非常小的时间差,进而计算操作(如 HTTP 请求)的精确耗时。
以下是一个简单的示例,使用 gettimeofday 来测试访问某个 URL 的延迟:
<?php
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">get_microtime</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable">$t</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gettimeofday</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$t</span></span><span>[</span><span><span class="hljs-string">'sec'</span></span><span>] + </span><span><span class="hljs-variable">$t</span></span><span>[</span><span><span class="hljs-string">'usec'</span></span><span>] / </span><span><span class="hljs-number">1e6</span></span><span>;
}
</span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">"https://www.example.com"</span></span><span>;
</span><span><span class="hljs-comment">// 记录开始时间</span></span><span>
</span><span><span class="hljs-variable">$start</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_microtime</span></span><span>();
</span><span><span class="hljs-comment">// 发起网络请求</span></span><span>
</span><span><span class="hljs-variable">$opts</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(
</span><span><span class="hljs-string">"http"</span></span><span> => </span><span><span class="hljs-keyword">array</span></span><span>(
</span><span><span class="hljs-string">"method"</span></span><span> => </span><span><span class="hljs-string">"GET"</span></span><span>,
</span><span><span class="hljs-string">"timeout"</span></span><span> => </span><span><span class="hljs-number">10</span></span><span>
)
);
</span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>(</span><span><span class="hljs-variable">$opts</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>);
</span><span><span class="hljs-comment">// 记录结束时间</span></span><span>
</span><span><span class="hljs-variable">$end</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_microtime</span></span><span>();
</span><span><span class="hljs-variable">$latency</span></span><span> = (</span><span><span class="hljs-variable">$end</span></span><span> - </span><span><span class="hljs-variable">$start</span></span><span>) * </span><span><span class="hljs-number">1000</span></span><span>; </span><span><span class="hljs-comment">// 转换为毫秒</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"访问 <span class="hljs-subst">$url</span></span></span><span> 的延迟为:" . </span><span><span class="hljs-title function_ invoke__">round</span></span><span>(</span><span><span class="hljs-variable">$latency</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>) . </span><span><span class="hljs-string">" 毫秒\n"</span></span><span>;
?>
该脚本通过 gettimeofday 计算 file_get_contents 网络请求前后的时间差,最终得出一个近似的延迟时间(以毫秒为单位)。
gettimeofday 是 PHP 中少有的高精度计时工具,尤其适合网络延迟测试或性能评估等对时间要求严格的场景。结合合适的上下文控制方式,可以轻松实现毫秒甚至微秒级的性能测量,为优化提供数据支持。