【发布时间】:2016-04-24 08:50:26
【问题描述】:
我有一个从 1 台服务器到另一台服务器的 Web 请求需要 1 秒。我的浏览器中的相同请求几乎不需要时间。我查看了各种类似的问题,并尝试了我能找到的所有建议,包括
- 使用 curl 代替 file_get_contents
- 在 file_get_contents 中嵌入您自己的关闭连接标头
- 使用 google 作为域来加速域查找
- 在目标服务器上使用标头来避免保持活动状态
这些都没有对时间产生任何影响。以下是我尝试过的方法:
$timeBefore = microtime(true);
//Only one of these active at a time
$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
$output = file_get_contents($url,false,$context);
//Or
$context=stream_context_create(array('http' => array('header'=>"Host: www.google.com\r\n")));
$output = file_get_contents($url, false, $context);
//Or
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$timeAfter = microtime(true);
然后登录到文件$timeAfter - $timeBefore。结果我总是得到大约 1.04202604294,使用它的客户端应用程序实际上看到了 1 秒的延迟。
作为一个附带说明,如果它是相关的,这里的 2 个服务器以下列方式与 A 对话,在 B 对 A 的回答期间,它将此 URL 发送回 A,然后将所有这些发送回其原始响应到 A。所以在从源连接期间有一个返回源的连接。
这是 curl_getinfo 的调试输出
content_type => text/html,
http_code => 200,
header_size => 219,
request_size => 479,
filetime => -1,
ssl_verify_result => 0,
redirect_count => 0,
total_time => 1.04360199999999991860022419132292270660400390625,
namelookup_time => 0.0001579999999999999915796522476085783637245185673236846923828125,
connect_time => 0.0007219999999999999855393451042573360609821975231170654296875,
pretransfer_time => 0.000772000000000000008264222639553508997778408229351043701171875,
size_upload => 0,
size_download => 1,
speed_download => 0,
speed_upload => 0,
download_content_length => -1,
upload_content_length => -1,
starttransfer_time => 1.0435689999999999688640173189924098551273345947265625,
redirect_time => 0,
redirect_url =>
此命令是从同一托管服务上的两台服务器相互发送的,它们都没有负载,并且是一个高质量的托管站点(液体网络专用服务器)。 response 和 url 都很小
【问题讨论】:
-
看看
curl_getinfo,它应该指出查找的每个阶段花费了多长时间,例如从 DNS 等解析名称需要多长时间。这将告诉您哪些区域需要优化。 -
我已经添加了上面的输出。
-
嗯,
starttransfer_time是大部分时间 - 您是否会遇到其他服务器的类似缓慢时间?您的服务器和目标服务器位于何处,相距多远? -
它们应该在同一个物理位置。这些服务器处理大量请求时没有什么比这更慢的了。
-
啊,如果两台服务器在同一个数据中心,请与您的托管服务提供商联系以帮助调试延迟的来源。也许他们可以使用一些网络跟踪工具来帮助找出原因?
标签: php