【问题标题】:Facebook connect is very slow, can I use AJAX?Facebook 连接很慢,我可以使用 AJAX 吗?
【发布时间】:2012-05-02 14:58:57
【问题描述】:

我正在实现 facebook php sdk 并将其用于用户登录/连接。 一切都按预期工作,但是,在每一页的顶部,我需要调用 $facebook->api('/me') 判断用户是否登录..

此调用非常慢,有时需要长达 2 秒才能返回。

因此,用户的任何交互在任何页面加载之前总是有 1-2 秒的延迟..

我怀疑,这是因为 $facebook->api('/me') 调用使用的是 httpS ..

任何建议....

          $facebook = new Facebook(array( 'appId'  => 'xxxxxxxxxxxxxxx',  'secret' => 'xxxxxxxxxxxxxxxxx',));
          $user = $facebook->getUser();
          if ($user)
           {
           try                               {  $user_profile = $facebook->api('/me','GET'); }
           catch (FacebookApiException $e)   {  error_log($e);  $user = null;  }
           }
          $login_parms = array('scope' => 'user_birthday', 'redirect_uri' => 'http://xxx.com/login');
          $login_link  = $facebook->getLoginUrl($login_parms);


          if($user) 
           {
           /* logged in */
           }
          else
           {
           /* not */
           }

【问题讨论】:

  • 我的问题是:ajax 是.. 我可以在后台调用 $facebook->api('me') 吗??
  • 你的问题的答案是:是的,你可以:)
  • 如果这是页面中唯一依赖于答案的部分,那么是的,只需使用 ajax,如果该页面上的其他任何内容(例如内容或菜单)取决于该答案,那么您将不得不等待在渲染一些剩余的页面内容之前回答

标签: php facebook fbconnect


【解决方案1】:

您真的不应该在每次页面加载时执行 Facebook API 请求。仅在用户登录时执行一次。然后您可以将“登录”标志存储在会话中(或签名的 cookie)。

如果您需要存储,例如一些用户的 facebook 个人资料信息,也将其放入会话或您的数据库中。

【讨论】:

    【解决方案2】:

    在登录表单所在的位置添加一些旋转轮,然后在准备好的文档上调用 ajax 到您的 php 脚本,脚本返回 false 或登录用户数据(或更多数据,如果需要 - 重定向 url),然后根据结果显示表单登录或显示当前登录的用户。

    我的意思是 Javascript 将根据服务器返回的内容、重定向、更改 UI 等处理所有逻辑。

    另一种方法是缓存(会话到期)如果用户登录记住它第一次调用 facebook。并检查该 Session 变量是否存在且尚未过期。仅在执行一些敏感任务或过期时再次调用。

    【讨论】:

    • 我不建议使用 javascript 进行身份验证(例如,重定向未经授权的用户)。 - 但也许我误解了你的句子“我的意思是 Javascript 将根据服务器返回的内容、重定向、更改 UI 等处理所有逻辑。”
    • 所有身份验证逻辑仍然必须在服务器上,是的,我不喜欢使用 javascript,但是当一切都从服务器处理时,我看不到安全问题。我的意思是“逻辑”是 UI。
    【解决方案3】:

    如果您不需要从 $facebook->api("/me") 获取“新鲜”值。 那么我建议你缓存响应,如果你使用任何 PHP 框架(例如 Zend、Yii、Codeigniter),这应该是非常直接的。

    如果您不使用 PHP 框架,我建议您仍然查看优秀的 ZF 文档以了解他们的缓存解决方案。

    Zend Framework - Cache

    但是,如果您每次加载都需要新的值,您可以创建一个仅返回 $facebook->api("/me") 部分并将其作为纯 HTML 返回的简单页面。然后简单地保留一个或类似的,当它完成时收到响应。 一个简单的解决方案是使用 jQuery,只需编写:

    $("#div-id").load("/page-that-returns-facebook-api-me-result");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2021-10-27
      • 2019-06-28
      • 2011-11-28
      相关资源
      最近更新 更多