我正试图与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?
答案 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',
来解决。