我正在从不同的交易所收集市场价格,交易所设置了1000秒的请求,但是我担心当我的网站被大量使用时,这个cURL功能在我的服务器上将占用大量资源。
这是cURL函数,它从2到4个交换中获取结果(取决于交换超时):
function curl($exchange,$timeout) {
$a = curl_init();
curl_setopt($a, CURLOPT_TIMEOUT, $timeout);
curl_setopt($a, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($a,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($a, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: application/json'));
curl_setopt($a, CURLOPT_URL, $exchange);
$result = curl_exec($a);
$httpCode = curl_getinfo($a, CURLINFO_HTTP_CODE);
if($httpCode == 200) {
return json_decode($result);
}
else {
return false;
}
curl_close($a);
}
我使用AJAX异步加载脚本,因为它需要几秒钟才能完成。它被加载在主页上,我预计每天会有大约15,000次独特点击。
如果每秒多次调用cURL,我是否会遇到问题?如果有更好的替代方案,我会遇到问题吗?
答案 0 :(得分:1)
一种选择是实现缓存机制,这肯定会减少服务器的开销。 ZF,Symfony和Laravel等框架都内置了这种机制。例如,在Laravel中,实现很简单:
Cache::put('key', 'value', $minutes); .
// Retrieving the data
if (Cache::has('key'))
{
// ......
$value = Cache::get('key');
// .......
}
在什么持久层上,数据将被缓存(文件,Memcached或Redis)取决于我们。在Laravel中它只是一个配置选项(假设我们的服务器安装了上述服务)。我们还应该实现一个“队列”服务来在后台运行“耗时”的任务(Beanstalkd,Ironio,亚马逊的SQS)。结合cron-job,我们的Queue服务可以更新/刷新缓存数据。在共享托管环境中,最明显的选择是使用“file”进行缓存,并使用基于云的Queue(Ironio也有免费套餐)。希望我的评论给你一个起点。
答案 1 :(得分:0)
不是对每个访问者执行cURL请求,而是使用Cron(等)设置一个计划任务,每隔几分钟更新一个MySQL表中的本地缓存。然后你只需要读取缓存的开销,而不必为每个页面加载发出多个cURL请求。
回答标题中的问题:不是非常密集。当然,您必须等待网络,但我不认为cURL会成为您的瓶颈,特别是如果您只是请求数据更新本地缓存。