【问题标题】:Optimizing cURL for speed优化 cURL 以提高速度
【发布时间】:2010-12-06 19:07:11
【问题描述】:

我正在制作一个频繁执行 API 调用的 Web 应用程序。所有 API 调用都只是简单的 GET 请求,但是我想尽可能加快加载时间和输出返回时间。截至目前,我正在使用 cURL 通过以下方式进行 API 调用:

<?php
function api_call($params)
  {
  $base = 'https://api.example.com/Api?';
  $url = $base . http_build_query( $params );
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($ch);
  return json_decode($output,true);
  }
?>

有什么方法可以优化它以加快下载和/或输出时间?

【问题讨论】:

    标签: php curl


    【解决方案1】:

    是否可以使用 IP 地址代替主机名 api.example.com?如果是,您可以加快 namelookup_delay(在我的情况下为几百毫秒)

    Keep-alive 对您的情况没有帮助,因为 keep-alives 不会在请求之间汇集连接。它在经典的 webbrowser-webserver 场景中很有用。

    【讨论】:

      【解决方案2】:

      如果多个 API 调用之间的数据有时相同,您有什么方法可以使用缓存?与其说是代码问题,不如说是连接速度问题。

      【讨论】:

      • +1 缓存在这里是一个很好的策略。它绝对有可能提高应用程序的速度。
      【解决方案3】:

      不是真的。那里的代码速度并不能真正得到优化。瓶颈将是您的服务器与其服务器之间的连接。您无法在代码中加快速度。

      【讨论】:

        【解决方案4】:

        您还可以做的另一件事是 也启用编码,因为它可以减少传输的数据。

        curl_setopt($ch, CURLOPT_ENCODING, '');//set gzip, deflate or keep empty for server to detect and set supported encoding.
        

        如果您启用编码,则数据将在发送前被压缩。 这可能需要一些时间,但如果您处理的是大数据,则传输的数据会非常少。

        【讨论】:

        • 这对我来说速度提升了 80/90%。
        【解决方案5】:

        如果请求发往同一台服务器,您可能会做的一件事是考虑使用 keepalive 连接。

        【讨论】:

        • 是的,调用是对同一个服务器的,只是输出中的参数不同,返回值不同。 keep-alive 对这个有好处吗?如果是这样,我如何使用 cURL 使 API 服务器和我的服务器之间的连接保持更长时间。
        • -1 php curl 自动使用keepalive。 stackoverflow.com/questions/972925/…
        • @Whitlock 说真的,你会因为投反对票而感到兴奋吗?我真的不认为这是一个糟糕的答案。也许他不知道更好。我认为 Tyler 是想帮助 lolmoney?
        • @Alfred,虽然一般来说keepalives是一件好事,但在这种情况下答案是错误的。 OP专门询问cURL。猜测并不能给出好的答案。
        【解决方案6】:

        优化:

        <?php
            function api_call($params)
            {
                $url='https://api.example.com/Api?'.http_build_query($params);
                return json_decode(file_get_contents($url),true);
            }
        ?>
        

        您还可以:

        1. 删除$url 变量并将字符串粘贴到file_get_contents()
        2. 如果$params没有改变,那么你也可以删除http_build_query();并将其结果一次保存到变量中。

        【讨论】:

          【解决方案7】:

          您可以使用多线程来启动脚本的更多副本。它可以更快地执行您的请求

          【讨论】:

          • -1 这仅在您有一堆网址要同时获取时才有效。
          猜你喜欢
          • 2011-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-24
          • 2021-07-23
          相关资源
          最近更新 更多