2014-10-09 102 views
2

我的网站通过卷曲查询的Facebook的股数:缓存来自Facebook的Open Graph结果的最佳方式?

http://graph.facebook.com/?ids=MY_SITE_URL 

不过,我经常发现我已经达到了rate limit。缓存这些数据并将其显示在页面上的最佳机制是什么?我的网站没有使用数据库,为此创建一个数据库似乎很愚蠢。

谢谢!

回答

3

是memcache或Redis是一个不错的选择。

其他方法是你可以使用Facebook的批量API功能。它会一次执行多个请求,因此在一个查询中可以找到多个URL的共享数。 https://developers.facebook.com/docs/graph-api/making-multiple-requests/

第二个选项是你可以在php中创建全局数组。例如

$globalArray = array(); 

然后,您可以为每个Share Count URL创建密钥,然后存储从API获取的结果。例如,

$globalArray['url'] = $resultFromAPI; 

通过这种方式,你可以存储数据,直到你刷新页面。

第三个选项是创建每个分享计数URL的会话并将其存储在其中,并在用户注销时清除会话。

那么每次当您为特定网址获取份额时,请首先检查您是否具有该网址的值?对于e.g

if(isset($_SESSION['url']) && !empty($_SESSION['url']){ 
    $count = $_SESSION['url'];  
}else{ 
    // fetch through facebook graph API 
} 

如果使用Zend框架Zend公司相比注册表是也是一个很好的选择,它的工作同样喜欢PHP会议。

如果您想获取最新信息,则需要调用Graph API。但是,您可以构建只在一小时后获取数据的逻辑。我的意思是您可以每隔一小时清除会话以查看这些共享URL并将数据再次保存到这些会话变量中。

希望它有助于。

1

尝试向您的请求添加应用访问令牌。这应该理想地解决您的费率限制问题。试试看:

http://graph.facebook.com/?ids=MY_SITE_URL&access_token={app_id}|{app_secret} 

例如,你可以使用Redis的作为高速缓存和过期时间3600的键(在这种情况下,也许URL的MD5散列)包含图形API结果数据缓存中的数据一小时......

+0

用户不会登录我的网站,这似乎是对此解决方案的要求。那是对的吗? – Peter 2014-10-10 03:08:01

+1

应用程序访问令牌与使用Facebook登录时收集的用户访问令牌无关:https://developers.facebook.com/docs/facebook-login/access-tokens我想知道:是否调用Graph API在每一个请求你的网站的请求作出?如果是这样,那将是baaaad设计。 – Tobi 2014-10-10 06:22:04

+0

这就是我想要避免的。我希望为用户提供合理的最新信息,而且我想知道如何缓存它,因此它不会在每次页面访问时发出请求。 – Peter 2014-10-10 16:54:06

0

你可以使用memcache或redis来做同样的事情。根据需要缓存每个用户数据以及其他详细信息。例如,您可以使用单个的ID或URL作为缓存键。

1

一种方法是,您可以通过将URL转换为哈希并基于文件的时间戳与刷新缓存或删除过期缓存一起使用文件名作为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() 
0

我不是高手或高级程序员。我曾经有过类似的问题,即使没有facebook。

因此,我所做的就像是在服务器上维护了一个文件,我在其中存储了一个时间戳和当前计数[我相信您可以在服务器中创建文件。]当每个请求到达时,时间戳与文件中的时间戳。因此,如果差异超过30分钟[可以任意设置限制],我会再次发送API请求,并使用新的时间戳和计数更新文件。相反,如果差异小于30分钟,我所做的就是取文件中的计数并显示它,而不是发送API请求。

这是一个非常简单而有效的方法。但我不知道这是不是你正在寻找的东西,它会解决你的问题。