PHP Curl API响应时间因不同服务器而异

9

我有一个设置,其中有两台运行轻客户端(Apache、PHP)的服务器。在A服务器上,它被视为客户机,并通过 Restful API 连接到 B 服务器以获取数据。两个服务器都在同一网络中。在 B 服务器上,请求的响应如下所示:

{
   "code": 200,
   "response_time": {
      "time": 0.43,
      "measure": "seconds"
   }
}

服务器 B 使用 microseconds 标记请求块的开始和结束来计算每个任务的完成时间。但是当我使用 curl 在服务器 A 上调用服务器 B 时,执行时间的结果非常奇怪:

   $url = "https://example.com/api"; 
   /*server B address. I've tried IP address as well without any change in results. 
     This must go over a SSL connection. */

    $start_time = microtime(true);

    $curl2 = curl_init();

    curl_setopt($curl2, CURLOPT_URL, $url);
    curl_setopt($curl2, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl2, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl2, CURLOPT_USERAGENT, "Server A User Agent");

    $result = curl_exec($curl2);

    $HttpCode = curl_getinfo($curl2, CURLINFO_HTTP_CODE);
    $total_time = curl_getinfo($curl2, CURLINFO_TOTAL_TIME);
    $connect_time = curl_getinfo($curl2, CURLINFO_CONNECT_TIME);
    $namelookup_time = curl_getinfo($curl2, CURLINFO_NAMELOOKUP_TIME);

    $end_time = microtime(true);

    $timeDiff = round(((float)$end_time - (float)$start_time), 3);

每次检查时间,我都会得到以下结果:
 $timeDiff = 18.7381 (Using Microseconds)
 $total_time = 18.7381 (Transfer Time)
 $connect_time = 0.020679
 $namelookup_time = 0.004144

所以我不确定为什么会出现这种情况。是否有更好的方式从网络中另一台持有 API 的服务器中获取数据?就像 Twitter 的网站从不是 API 服务器的另一个服务器消费他们的 API 一样。我认为使用 `curl` 访问 API 的时间应该与 API 报告的时间相当。我理解 API 不考虑网络流量和连接打开速度,但 18 秒与 0.43 秒之间的差异对我来说很奇怪。你有什么想法吗?

API返回了什么数据?这些数据有多大? - ʰᵈˑ
数据以JSON格式返回。它可能相当大 - 不确定大小,但一个样本文件的内容长度为“Content-Length: 136917”。 - gregavola
你的服务器在接收数据时的下载速度是多少?我曾经见过一些设置为128kps的,所以你应该考虑一下这个问题! - Jack M.
2个回答

7

现在问题不再是curl本身,而是你的网络设置出了问题。你可以通过以下几个步骤来检查:

1)使用ping命令来检查响应时间。

From Server-A: ping Server-B-IP
From Server-B: ping Server-A-IP

2) 类似地,您可以使用 traceroute 命令(对于 Windows 系统,请使用 tracert)来检查响应时间。您应该会立即得到响应。

From Server-A: traceroute Server-B-IP
From Server-B: traceroute Server-A-IP

3)使用wgetcurl命令行将一个大文件(比如说100MB)从一个服务器下载到另一个服务器,然后检查需要多长时间。例如使用wget

From Server-B: wget http://server-A-IP/test/test-file.flv
From Server-A: wget http://server-B-IP/test/test-file.flv

除了这些基本的例行检查外,您还可以使用一些高级工具来解决这个网络问题。例如以下两个链接中的命令/示例:

测试两个Linux服务器之间的网络连接性能
在两个服务器之间测试带宽的命令行工具


1
我大约三天前也遇到了同样的问题。为了找出问题,我浪费了整个下午。最终,我联系了我的服务器提供商并告诉他问题所在。他说,这不是我的脚本的问题,而是运营商(网络)的问题。
也许你遇到的是我遇到过的问题,请联系你的服务器提供商并询问他。
你是否尝试使用file_get_contents? 如果响应时间相同,那将会很有趣。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接