我正在实现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 */
}
答案 0 :(得分:2)
你真的不应该在每个页面加载上执行Facebook API请求。只有在用户登录时才执行一次。然后您可以在会话中存储“登录”标志(或签名的cookie)。
如果您需要存储,例如一些用户的Facebook个人资料信息,也将它放在会话或您的数据库中。
答案 1 :(得分:1)
在登录表单中添加一些旋转轮,然后在文档上调用ajax准备好你的php脚本,脚本返回false或loged用户数据(或者如果你需要更多数据 - 重定向url)然后根据结果show form来登录或显示当前隐藏在用户中。
我的意思是Javascript将处理所有逻辑,具体取决于从服务器返回的内容,重定向,更改UI等。
另一种方法是缓存(会话有效期)首次调用facebook,如果用户已经记住它。并检查该Session变量是否存在且尚未过期。只在执行某些敏感任务时才会再次呼叫或过期。
答案 2 :(得分:0)
如果您不需要从$ facebook-> api(“/ me”)获取“新鲜”值。 然后我建议你缓存响应,如果你使用任何PHP框架(例如Zend,Yii,Codeigniter),这应该是非常直接的。
如果您没有使用PHP框架,我建议您仍然可以查看优秀的ZF文档,了解其缓存解决方案。
但是,如果您每次加载都需要新值,则可以创建一个只返回$ facebook-> api(“/ me”)部分的简单页面,并将其作为裸HTML返回。然后简单地保留一个或类似的,当它完成时收到响应。 一个简单的解决方案是使用jQuery并写下:
$("#div-id").load("/page-that-returns-facebook-api-me-result");