3

我正在实现 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 */
           }
4

3 回答 3

2

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

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

于 2012-05-02T15:16:18.247 回答
0

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

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

Zend 框架 - 缓存

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

$("#div-id").load("/page-that-returns-facebook-api-me-result");
于 2012-05-02T15:12:07.780 回答
0

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

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

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

于 2012-05-02T15:13:58.010 回答