Я использую 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 одновременных запросов?
Спасибо.