【问题标题】:Best way to cache Open Graph results from Facebook? [closed]从 Facebook 缓存 Open Graph 结果的最佳方法是什么? [关闭]
【发布时间】:2014-10-09 14:55:34
【问题描述】:

我的网站通过 cURL 向 Facebook 查询共享计数:

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

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

谢谢!

【问题讨论】:

    标签: php facebook caching curl facebook-opengraph


    【解决方案1】:

    是的,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 清除会话并将数据再次保存到这些会话变量中。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      一种方法是,您可以通过将 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()
      

      【讨论】:

        【解决方案3】:

        尝试将应用访问令牌添加到您的请求中。理想情况下,这应该可以解决您的速率限制问题。试试看:

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

        例如,您可以使用 Redis 作为缓存并 EXPIRE 3600 包含 Graph API 结果数据的键(在这种情况下可能是 URL 的 md5 哈希)以将数据缓存一小时...

        【讨论】:

        • 用户不登录我的网站,这似乎是此解决方案的要求。对吗?
        • 应用访问令牌与用户访问令牌无关,用户访问令牌是在使用 Facebook 登录时收集的:developers.facebook.com/docs/facebook-login/access-tokens 我想知道:对 Graph API 的调用是否针对您网站的每个请求进行?如果是这样,那将是 baaaad 设计。
        • 这就是我要避免的。我想为每个用户获取合理的最新信息,我想知道如何缓存它,这样它就不会在每个页面点击时都发出请求。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我不是大师或高级程序员。我曾经遇到过类似的问题,即使不是 facebook。

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

          这是一种非常简单有效的方法。但我不知道这是否是您正在寻找的,它会解决您的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-19
            • 1970-01-01
            • 2012-11-06
            • 1970-01-01
            相关资源
            最近更新 更多