【问题标题】:Yii2 session lost after controller action ends控制器操作结束后 Yii2 会话丢失
【发布时间】:2018-04-14 04:05:11
【问题描述】:

我目前正在尝试与 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 但我之前存储的那个变量不再存在?

编辑:: 我认为问题出在这些设置上::

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?

【问题讨论】:

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


    【解决方案1】:

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

      \Yii::$app->end();
    

    这个函数在生产模式下的结果等于exit()或die()

    正如文档所说:

    关闭函数和对象析构函数将始终执行,即使 如果调用了出口。

    表示执行后 这些函数也被执行了:

    session_write_close();
    

    所以尝试将您的代码更改为:

        //Setup for the return of JSON. (!!!) This two lines are equal 
        \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);
        }
    
        return json_encode($returnData, JSON_PRETTY_PRINT);
    

    【讨论】:

      【解决方案2】:

      我能够解决这个问题。

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        相关资源
        最近更新 更多