接收“;给定__PHP_Incomplete_Class的实例“;当将Facebook会话存储在PHP$_session


Recieving "instance of __PHP_Incomplete_Class given" when storing the Facebook session in the PHP $_SESSION array

我正在尝试实现服务器端的PHP facebook身份验证代码,以使用我的前端Javascript facebook身份验证码。

为此,我获取当前的facebook会话,将其存储到PGP$_session数组中,然后使用它进行调用以获取用户的用户名。

在第二次进入侧面时,我检查PHP$_session数组中是否有存储的facebook会话,如果有,我会再次使用它来调用以获取用户名。在尝试使用存储的会话时,我在此处收到"给定__PHP_Incomplete_Class实例"错误消息。

我想在页面刷新之间存储facebook会话的原因是,每当我调用$session=$helper->getSession()时;第二次用户登录后,我收到一条消息"此授权码已被使用"。我在某个地方读到,你需要存储facebook会话,而不是每次刷新都调用一个新的会话,因为在获取第一个会话对象时已经消耗了facebook令牌。

有人能帮我找出如何将facebook会话正确存储在PHP$_session数组中,并能够将其提取出来,并使用它来调用facebook吗?

我使用的是最新的facebook JS sdk和最新的facebook PHP sdk。

代码:

<?php
session_start();
require_once ('facebookphpsdkv4/src/Facebook/GraphObject.php');
require_once ('facebookphpsdkv4/src/Facebook/GraphUser.php');
require_once ('facebookphpsdkv4/src/Facebook/GraphSessionInfo.php');
require_once ('facebookphpsdkv4/src/Facebook/Entities/AccessToken.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookSession.php');
require_once ('facebookphpsdkv4/src/Facebook/Entities/SignedRequest.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookSignedRequestFromInputHelper.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookJavaScriptLoginHelper.php');
require_once ('facebookphpsdkv4/src/Facebook/HttpClients/FacebookHttpable.php');
require_once ('facebookphpsdkv4/src/Facebook/HttpClients/FacebookCurl.php');
require_once ('facebookphpsdkv4/src/Facebook/HttpClients/FacebookCurlHttpClient.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookResponse.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookRequest.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookSDKException.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookRequestException.php');
require_once ('facebookphpsdkv4/src/Facebook/FacebookAuthorizationException.php');
useFacebookGraphObject;
useFacebookGraphUser;
useFacebookGraphSessionInfo;
useFacebookEntitiesAccessToken;
useFacebookFacebookSession;
useFacebookEntitiesSignedRequest;
useFacebookFacebookSignedRequestFromInputHelper;
useFacebookFacebookJavaScriptLoginHelper;
useFacebookHttpClientsFacebookHttpable;
useFacebookHttpClientsFacebookCurl;
useFacebookHttpClientsFacebookCurlHttpClient;
useFacebookFacebookResponse;
useFacebookFacebookRequest;
useFacebookFacebookSDKException;
useFacebookFacebookRequestException;
useFacebookFacebookAuthorizationException;
FacebookSession::setDefaultApplication('AppID', 'AppSecret');
if (isset($_SESSION['session']))
    {
    echo 'session set';
    $session = $_SESSION['session'];
    }
  else
    {
    $helper = new FacebookJavaScriptLoginHelper();
    try
        {
        $session = $helper->getSession();
        $_SESSION['session'] = $session;
        }
    catch(FacebookRequestException $e)
        {
        echo "Exception occured, code: " . $e->getCode();
        echo " with message: " . $e->getMessage();
        }
    catch(Exception $e)
        {
        echo "Exception occured, code: " . $e->getCode();
        echo " with message: " . $e->getMessage();
        }
    }
if ($session)
    {
    try
        {
        $user_profile = (new FacebookRequest($session, 'GET', '/me'))->execute()->getGraphObject(GraphUser::className());
        echo "Name: " . $user_profile->getName();
        }
    catch(FacebookRequestException $e)
        {
        echo "Exception occured, code: " . $e->getCode();
        echo " with message: " . $e->getMessage();
        }
    }
?>

您有一个__PHP_Incomplete_class错误,因为您在包含类文件之前获得了会话(使用session_start()调用)。

在您的会话变量中存在PHP未知类型的对象(因为您的需求是session_start()之后的),所以PHP不知道如何"重建"这些对象。