[英]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.