我几个月来一直在使用Facebook登录(PHP SDK)网站而没有任何问题。 几天以来,我们遇到了问题。
这是代码
$fbconfig['appid' ] = "...";
$fbconfig['secret'] = "...";
$fbconfig['baseurl'] = "myurl/index.php";
$facebook = new Facebook(array(
'appId' => $fbconfig['appid'],
'secret' => $fbconfig['secret'],
'cookie' => true,
));
$user = $facebook->getUser();
$loginUrl = $facebook->getLoginUrl(
array(
'scope' => 'email,user_likes,user_birthday',
'redirect_uri' => $fbconfig['baseurl']
)
);
$logoutUrl = $facebook->getLogoutUrl(
array(
'next' => $fbconfig['baseurl'].'?f=logout'
)
);
if ($user) {
....try {
$fb_user_infos_ar = $facebook->api('/me');
}
catch (FacebookApiException $e) {
$facebook->destroySession();
$user = null;
}
}
if (isset($fb_user_infos_ar)){
do something...
}
else{
show facebook login button
}
我们遇到的问题是登录似乎有效,但过了一段时间(大部分时间甚至几秒钟后)用户不再被识别为登录到facebook($ user为0和登录按钮)显示)。
过去几天,Facebook规则或浏览器是否有任何可以解释此行为的变化?我尝试使用firefox和chrome同样的结果。 由于我的PHP sdk已经有几个月了,我也尝试了最新的一个,结果相同。我也注意到在上一个版本的例子中,“base_url”不再被提及了,你知道为什么吗?
评论后编辑
在评论中提出一些提示之后,我试图调试正在发生的事情;似乎令牌不会变得无效;事实上,当我再次登录时,我仍然会在几小时前收到令牌。
出于某种原因,有时候用户被认为是NOT LOGGED(基本上$ facebook-> getUser()是假的),即使他是LOGGED。
其中一个原因,正如complex857所暗示的那样,可能是facebook在与我的网站交谈时遇到了问题;在最后几天我实际上注意到网站上的一般性能损失,并且在今天的调试会话之后,我可以说当涉及到facebook活动时会出现性能损失。 特别是我测量了这条指令的执行时间:
$fb_user_infos_ar = $facebook->api('/me');
大约5秒;我不知道它花了多长时间,但我想是太多了;你觉得怎么样?
关于可能的Cookie问题,我应该检查什么?
回答后编辑2
更多细节:如果API调用期间出现问题(catch部分)我曾经用
破坏facebook会话$facebook->destroySession();
这就是用户注销的原因。有时实际上不需要销毁会话(例如,如果由于网络问题导致超时),那么我应该根据错误处理异常。
据我所知,Andy Jones提供的代码片段
echo "error code = " . $e->getCode() . " error = " . $e->getMessage() . "\n";
适用于CURL错误但不适用于其他类型的错误(例如令牌已过期)。例如,如果由于密码更改而令牌无效时我打印出异常,我得到:
FacebookApiException对象( [结果:protected] =>排列 ( [错误] =>排列 ( [message] =>验证访问令牌时出错:会话已失效,因为用户已更改了 密码。 [type] => OAuthException [code] => 190 [error_subcode] => 460 )
) [message:protected] => Error validating access token: The session has been invalidated because the user has changed the password. [string:Exception:private] => [code:protected] => 0 ....
$ e-> getCode()只给我0而不是190。
以下是错误列表:https://developers.facebook.com/docs/reference/api/errors/我认为在我的特定情况下处理流程的一种简单方法是:如果代码为190或102,则销毁facebook会话,否则尝试重复操作。您如何看待以及哪种代码能够以最佳方式处理此问题?
另一个问题:在使用$ e-> getMessage()记录异常的同时,我得到了 “验证访问令牌时出错:会话已失效,因为用户已更改密码。” 但我确信对于我当时使用的用户(我自己)我没有更改Facebook密码。怎么会发生这种情况?即使在其他情况下也会产生相同的消息(例如,当令牌处于其自然到期日期时)?
感谢。
答案 0 :(得分:0)
有许多事情可能出错,你应该检查根本原因并采取适当行动......
} catch (FacebookApiException $e) {
$facebook->destroySession();
$user = null;
}
目前,您只是在破坏会话并继续前进。但是,例外有很多精彩的数据。从FacebookBase.php
开始,您会在函数makeRequest
中找到FacebookAPIException
。
$e = new FacebookApiException(array(
'error_code' => curl_errno($ch),
'error' => array(
'message' => curl_error($ch),
'type' => 'CurlException',
)));
throw $e;
最重要的是,您要检查来自curl_errno
的cURL错误代码和来自curl_error
的人类可读消息。你可以这样做......
echo "error code = " . $e->getCode() . " error = " . $e->getMessage() . "\n";
Curl会告诉你explanation of the error code出了什么问题。对于一些更常见的错误,(6 =无解析主机,7 =无连接,28 =超时),这可能表示您的网络连接,Facebook或介于两者之间的某个问题。或者Facebook API可能只是忙碌而没有快速响应。最常见的反应就是再试一次。
如果您看到错误代码为0(零) - 没有错误 - 这意味着Facebook的通话工作正常,但Facebook根本没有返回任何数据。这是Facebook的错误。
如果您发现其他错误,请查看explanation of error codes,然后从那里开始。
Facebook Graph API不保证正常运行时间。您应该尽可能多地考虑缓存,并在出现错误时进行处理。我知道这对程序员来说更有用,但这是我们正在移动的互联世界。