【发布时间】:2014-10-09 14:55:34
【问题描述】:
我的网站通过 cURL 向 Facebook 查询共享计数:
http://graph.facebook.com/?ids=MY_SITE_URL
但是,我经常发现我已联系到rate limit。缓存这些数据并将其显示在页面上的最佳机制是什么?我的网站不使用数据库,为此创建一个数据库似乎很愚蠢。
谢谢!
【问题讨论】:
标签: php facebook caching curl facebook-opengraph
我的网站通过 cURL 向 Facebook 查询共享计数:
http://graph.facebook.com/?ids=MY_SITE_URL
但是,我经常发现我已联系到rate limit。缓存这些数据并将其显示在页面上的最佳机制是什么?我的网站不使用数据库,为此创建一个数据库似乎很愚蠢。
谢谢!
【问题讨论】:
标签: php facebook caching curl facebook-opengraph
是的,memcache 或 Redis 是一个不错的选择。
其他方式是您可以使用 Facebook 的批处理 API 功能。它将一次执行多个请求,因此在一个查询中您可以找到超过一个 URL 的共享计数。 https://developers.facebook.com/docs/graph-api/making-multiple-requests/
第二个选项是你可以在 php.ini 中创建全局数组。例如
$globalArray = array();
然后,您可以为每个 Share Count 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 框架,那么 Zend Registry 也是一个不错的选择,它可以像 PHP 会话一样工作。
如果您需要最新信息而不是需要调用 Graph API。但是您可以构建仅在一小时后获取数据的逻辑。我的意思是您可以每隔一小时为这些共享 URL 清除会话并将数据再次保存到这些会话变量中。
希望对你有帮助。
【讨论】:
一种方法是,您可以通过将 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()
【讨论】:
尝试将应用访问令牌添加到您的请求中。理想情况下,这应该可以解决您的速率限制问题。试试看:
http://graph.facebook.com/?ids=MY_SITE_URL&access_token={app_id}|{app_secret}
例如,您可以使用 Redis 作为缓存并 EXPIRE 3600 包含 Graph API 结果数据的键(在这种情况下可能是 URL 的 md5 哈希)以将数据缓存一小时...
见
【讨论】:
你可以使用 memcache 或 redis 来做同样的事情。根据要求缓存每个用户数据以及其他详细信息。例如,您可以使用单个 id 或 url 作为缓存键。
【讨论】:
我不是大师或高级程序员。我曾经遇到过类似的问题,即使不是 facebook。
所以我所做的是,我在服务器中维护了一个文件,其中存储了时间戳和当前计数。[我相信您可以在服务器中创建文件。]当每个请求到来时,我都会检查当前时间戳与文件中的时间戳。因此,如果差异超过 30 分钟[您可以任意设置限制],我将再次发送 API 请求并使用新的时间戳和计数更新文件。相反,如果差异小于 30 分钟,我所做的就是在文件中计数并显示它,而不是发送 API 请求。
这是一种非常简单有效的方法。但我不知道这是否是您正在寻找的,它会解决您的问题。
【讨论】: