控制器动作结束后,Yii2会话丢失

时间:2017-11-01 18:45:51

标签: php session yii yii2 yii2-basic-app

我正试图与Yii2应用程序一起运行Craft应用程序。我在正确的时间获得了正确的应用程序引导,但遇到了会话写入问题。

我将会话写入本地文件(默认的apache2文件)。

由于某种原因,当我尝试在我的Yii2应用程序中使用$_SESSION['something'] = 'test';向会话添加变量时,它会在应用关闭时关闭。

我添加了这个'某些东西'是Yii2中会话的关键,并在3秒后尝试访问我的Craft应用程序中的会话变量。

为什么会话变量迷失了?如果我在从Yii2应用程序返回之前打印出$ _SESSION,那么它会在我的操作完成后从会话中丢失但是会丢失吗?

我的控制器完成执行的方式是:

        //Setup for the return of JSON.
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        header('Content-type: application/json');

        $returnData = self::filterOutSensitiveResponseInfo($returnData);

        //Get timeouts for the front-end.
        $returnData = [
            "responseData" => $returnData
        ];

        //Handle logging of the return from controller.
        if(self::includeCurrentActionInLogs()){
            self::logActionTiming();        
            self::logActionResponse($returnData);
        }

        //output JSON to the front-end.
        echo json_encode($returnData, JSON_PRETTY_PRINT);

        //Handle successful shutdown of the application.
        \Yii::$app->end();
        return;

完成此代码后,我立即调用另一个控制器操作并查看$ _SESSION,但我之前存储的变量不再存在?

EDIT :: 我认为问题在于这些设置::

session.cooke_secure ON
session.name = CraftSessionId
session.cookie_httponly ON

^这些是CraftCMS的设置

session.cooke_secure OFF
session.name = PHPSessionId
session.cookie_httponly OFF

^这些是Yii2的设置。

如何更改这些设置以匹配Craft?

2 个答案:

答案 0 :(得分:0)

我从不使用CraftCms,但我认为问题在于这一行:

 <img src="https://i.imgur.com/Z3AgRDe.png"> 

结果中生产模式中的此功能等于 \Yii::$app->end(); exit()

正如文档所说:

  

关闭函数和对象析构函数将始终执行   如果叫出口。

这意味着执行后 这些功能也已执行:

die()

因此,请尝试将代码更改为:

session_write_close();

答案 1 :(得分:0)

我能够解决这个问题。

问题是CraftCMS使用不同的session.name设置为CraftSessionId而不是PHPSESSID,这是YII的默认值。这在尝试从Craft中获取YII2会话数据时引起问题,反之亦然。

通过在craftcms general.php中添加'phpSessionName' => 'PHPSESSID',来解决。