我的网站通过cURL查询Facebook的分享数量:
http://graph.facebook.com/?ids=MY_SITE_URL
但是,我经常发现我已经到达了rate limit。什么是缓存此数据并在页面上显示的最佳机制?我的网站不使用数据库,为此目的创建一个数据库似乎很愚蠢。
谢谢!
答案 0 :(得分:3)
是memcache或Redis是个不错的选择。
其他方式是您可以使用Facebook的批量API功能。它会一次执行多个请求,因此在一个查询中,您可以找到多于一个URL的共享计数。 https://developers.facebook.com/docs/graph-api/making-multiple-requests/
第二个选项是你可以在php中创建全局数组。例如
$globalArray = array();
然后,您可以为每个共享计数URL创建密钥,然后存储从API获取的结果。例如。
$globalArray['url'] = $resultFromAPI;
通过这种方式,您可以存储数据,直到刷新页面。
第三个选项是创建每个共享计数URL的会话并将值存储在其中,并在用户注销时清除会话。
然后,每当您获取特定URL的共享计数时,首先检查您是否具有该URL的值?例如
if(isset($_SESSION['url']) && !empty($_SESSION['url']){
$count = $_SESSION['url'];
}else{
// fetch through facebook graph API
}
如果您使用的是Zend Framework,那么Zend Registry也是一个不错的选择,它将像PHP会话一样工作。
如果您需要最新信息,请拨打Graph API。但是您可以构建仅在一小时后获取数据的逻辑。我的意思是您可以每隔一小时清除这些共享URL的会话并再次将数据保存到这些会话变量中。
希望它有所帮助。
答案 1 :(得分:1)
尝试为您的请求添加应用访问令牌。这应该理想地解决您的速率限制问题。试一试:
http://graph.facebook.com/?ids=MY_SITE_URL&access_token={app_id}|{app_secret}
例如,你可以使用Redis作为缓存,使用EXPIRE 3600键(在这种情况下可能是URL的md5哈希值),其中包含Graph API结果数据,用于将数据缓存一小时......
见
答案 2 :(得分:1)
一种方法是,您可以通过将url转换为hash并基于文件的时间戳工作来刷新缓存或删除过期的缓存,从而创建名为file的临时文件作为url的哈希值。
//Pseudo Code
urlHash = Hash(url)
if urlHash path exists:
if check_valid_timestamp:
fetch_file()
endif
if dont have data:
get_data_from_url()
create_and_store_in_file()
endif
show_result()
答案 3 :(得分:0)
您可以使用memcache或redis。根据要求缓存每个用户数据以及其他详细信息。例如,您可以使用单个ID或URL作为缓存键。
答案 4 :(得分:0)
我不是高手或高级程序员。我曾经遇到过类似的问题,即使不是Facebook。
所以我做的就是,我在服务器中维护了一个文件,我存储了一个时间戳和当前计数。[我相信你可以在你的服务器中创建文件。]当每个请求来了,我检查了当前的时间戳与文件中的时间戳。因此,如果差异超过30分钟[您可以任意设置限制]我将再次发送API请求并使用新的时间戳和计数更新文件。相反,如果差异小于30分钟,我所做的就是获取文件中的计数并显示它而不是发送API请求。
这是一种非常简单有效的方法。但我不知道这是否是您正在寻找的,它将解决您的问题。