在 PHP $_SESSION 数组中存储 Facebook 会话时收到 "instance of __PHP_Incomplete_Class given"

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 会话,如果有,我再次使用它来调用以获取用户名。这是我在尝试使用存储的会话时收到 "instance of __PHP_Incomplete_Class given" 错误消息的地方。

我想在页面刷新之间存储 facebook 会话的原因是每当我调用 $session = $helper->getSession();用户登录后第二次,我收到一条消息 "this authorization code has already been used"。我在某处读到你需要存储 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 错误,因为您在包含 class 文件之前获得会话(使用 session_start() 调用)。

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