Узкое место в производительности PHP Curl Создание запросов геокодирования Google Maps - PullRequest
2 голосов
/ 29 декабря 2010

Я использую PHP и CURL для выполнения запросов HTTP обратного геокодирования (lat, long -> address) к Google Maps.У меня есть главный аккаунт, поэтому мы можем выполнять множество запросов без ограничения или блокировки.

К сожалению, я достиг предела производительности.Ежедневно мы получаем около 500 000 запросов, которые необходимо геокодировать в обратном порядке.

Код довольно тривиален (я напишу кусочки в псевдокоде) ради экономии времени и места.Следующий фрагмент кода вызывается через задание каждые 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-запрос при каждой операции.У нас есть соединение со скоростью 100 Мбит / с, но сценарий, работающий на полной скорости, использует только около 1 Мбит / с.Нагрузка на сервер по сути ничего.Сервер представляет собой четырехъядерный процессор с 8 ГБ памяти.

Что мы можем сделать, чтобы увеличить пропускную способность?Есть ли способ открыть постоянный (keep-alive) HTTP-запрос с помощью Google Maps?Как насчет того, чтобы разбить работу по горизонтали, т.е. сделать 50 одновременных запросов?

Спасибо.

Ответы [ 2 ]

1 голос
/ 07 января 2011

некоторые вещи, которые я бы сделал:

  • независимо от того, насколько вы «премиум», выполнение внешних http-запросов всегда будет узким местом, поэтому для начала запрос кеша + ответ -вы все равно можете обновлять их через cron на регулярной основе

  • это одиночные http-запросы - вы никогда не получите «полную скорость» с ними, особенно если запрос и ответ настолько малы (<1MB)- tcp / handshaking / headers / etc.так что попробуйте использовать multicurl (если ваша премия это позволяет) для запуска нескольких запросов - это должно дать вам полную скорость;) </p>

  • добавить «Connection: close» в заголовок запроса, который вы отправляете,это немедленно закроет http соединение, чтобы ваш сервер и сервер Google не были забиты с помощью halfopen

0 голосов
/ 17 июля 2011

Учитывая, что вы выполняете все свои запросы последовательно, вам следует разбить работу на несколько машин или процессов. Тогда каждый может быть запущен параллельно. Судя по вашим тестам, вы ограничены скоростью выполнения каждого ответа Curl, а не процессором или пропускной способностью.

Мое первое предположение - слишком взглянуть на систему очередей ( Gearman , RabbitMQ ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...