PHP Curl性能瓶颈导致Google Maps地理编码请求

PHP Curl性能瓶颈导致Google Maps地理编码请求,php,curl,Php,Curl,我使用PHP和CURL向googlemaps发出HTTP反向地理编码(lat,long->address)请求。我有一个卓越理财帐户,因此我们可以在不受限制或阻止的情况下发出大量请求 不幸的是,我已经达到了性能极限。我们每天收到大约500000个需要反向地理编码的请求 为了节省时间和空间,代码非常简单(我将用伪代码编写代码片段)。以下代码片段通过作业每隔15秒调用一次 <?php //get requests from database $requests = get_re

我使用PHP和CURL向googlemaps发出HTTP反向地理编码(lat,long->address)请求。我有一个卓越理财帐户,因此我们可以在不受限制或阻止的情况下发出大量请求

不幸的是,我已经达到了性能极限。我们每天收到大约500000个需要反向地理编码的请求

为了节省时间和空间,代码非常简单(我将用伪代码编写代码片段)。以下代码片段通过作业每隔15秒调用一次

<?php
    //get requests from database
    $requests = get_requests();

    foreach($requests as $request) {
        //build up the url string to send to google
        $url = build_url_string($request->latitude, $request->longitude);

        //make the curl request
        $response = Curl::get($url);

        //write the response address back to the database
        write_response($response);
     }

     class Curl {
          public static function get($p_url, $p_timeout = 5) {
               $curl_handle = curl_init();
               curl_setopt($curl_handle, CURLOPT_URL, $p_url);
               curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, $p_timeout);
               curl_setopt($curl_handle, CURLOPT_TIMEOUT, $p_timeout);
               curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);

               $response = curl_exec($curl_handle);
               curl_close($curl_handle);

               return $response;
          }
     }
?>

性能问题似乎是CURL请求。它们非常慢,可能是因为每次操作都会发出完整的HTTP请求。我们有一个100mbps的连接,但是全速运行的脚本只利用了大约1mbps。服务器上的负载基本上是零。服务器是四核的,有8GB的内存

我们可以做些什么来提高这个系统的吞吐量?有没有办法用谷歌地图打开持久(保持活动)HTTP请求?将工作水平展开,即提出50个并发请求,怎么样


谢谢。

有些事情我会做:

  • 无论您多么“高级”,执行外部http请求始终是一个瓶颈,因此对于初学者来说,缓存请求+响应-您仍然可以通过cron定期更新它们

  • 这些是单一的http请求—您永远不会得到“全速”处理,尤其是在请求和响应非常小(<1MB)的情况下—tcp/握手/标头等。 因此,请尝试使用multicurl(如果您的premium允许的话)来启动多个请求-这将为您提供全速;)

  • 在您发送的请求头中添加“Connection:close”,这将立即关闭http连接,这样您和google的服务器就不会受到半开放的攻击


    • 考虑到您正在按顺序运行所有请求,您应该考虑将工作划分到多台机器或进程上。然后每个都可以并行运行。根据基准测试判断,您受到每个Curl响应速度的限制,而不是CPU或带宽的限制


      我的第一个猜测是看排队系统(,)

      希望你能得到回复。Curl能够执行保持活动状态的请求。您还应该搜索curl文档的一件事是HTTP管道。管道是HTTP/1.1协议中的一个补充,只是为了解决您的问题。不只是使用HTTP keepalive会话,而是按请求组发送请求,并按组获取结果。libcurl支持HTTP管道。如果GoogleMaps服务器接受来自您的管道,并且您只获得请求,并且路径中没有太多奇怪的代理,那么您可以获得很多性能。