簡體   English   中英

Yii2會話在控制器操作結束后丟失

[英]Yii2 session lost after controller action ends

我目前正在嘗試與Yii2應用程序一起運行Craft應用程序。 我在正確的時間啟動了正確的應用程序,但是遇到了會話編寫問題。

我正在將會話寫入本地文件(默認apache2文件)。

由於某些原因,當我嘗試使用$_SESSION['something'] = 'test';向會話添加變量時$_SESSION['something'] = 'test'; 在我的Yii2應用中,該應用在關閉的那一刻變得不可用。

我將這個“東西”鍵添加到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?

我從未使用過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);

我能夠解決此問題。

問題是CraftCMS利用了另一個session.name ,將其設置為CraftSessionId而不是YII默認的PHPSESSID 試圖從Craft內部獲取YII2會話數據時會引起問題,反之亦然。

通過在craftcms general.php中添加'phpSessionName' => 'PHPSESSID',來解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM