【问题标题】:Web request from inside PHP slower then browser来自 PHP 内部的 Web 请求比浏览器慢
【发布时间】: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


【解决方案1】:

如果不运行完全相同的代码并在我们的浏览器中连接到同一站点,这几乎是无法诊断的。但一般来说,你的浏览器会比 CURL 做更多的事情来与服务器协商快速连接。这包括支持 HTTP/2 和 gzip,这两者都使数据从端到端传输更快。

【讨论】:

  • 请注意,此请求中的有效负载相当小,两台机器之间的 ping 小于 1 毫秒,所以我觉得还有更多事情要做,然后进行优化以将速度提高到 1 秒。
【解决方案2】:

我的经验是联系另一个页面/服务器需要时间。
您可以做的是通过将数据缓存 x 分钟来限制它所做的连接数。 (如果可能的话)

我使用 put_file_contents() 将我的数据缓存到一个 txt 文件中,然后使用 filemtime() 查看文件的年龄。
这样,您只需要使用 file_get_contents() 从本地 txt 文件中读取数据即可。

这会加快速度,但也意味着您可以显示“过时”的数据。

【讨论】:

  • 这实际上是一个正在给出的命令,而不是一个显示的网页,所以这不是一个选项。
猜你喜欢
  • 2017-05-07
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多