PHP Curl性能瓶颈导致Google Maps地理编码请求
我使用PHP和CURL向googlemaps发出HTTP反向地理编码(lat,long->address)请求。我有一个卓越理财帐户,因此我们可以在不受限制或阻止的情况下发出大量请求 不幸的是,我已经达到了性能极限。我们每天收到大约500000个需要反向地理编码的请求 为了节省时间和空间,代码非常简单(我将用伪代码编写代码片段)。以下代码片段通过作业每隔15秒调用一次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
//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服务器接受来自您的管道,并且您只获得请求,并且路径中没有太多奇怪的代理,那么您可以获得很多性能。