Я пытаюсь запустить приложение Craft вместе с приложением Yii2. Я получил правильную загрузку приложения в нужное время, но столкнулся с проблемой записи сеанса.
Я записываю сессии в локальный файл (файл apache2 по умолчанию).
По какой-то причине, когда я пытаюсь добавить переменную в сеанс, используя $_SESSION['something'] = 'test';
в моем приложении Yii2 оно становится недоступным в ту минуту, когда приложение закрывается.
Я добавляю этот ключ что-то к сеансу в Yii2 и пытаюсь получить доступ к переменной сеанса в моем приложении Craft примерно через 3 секунды.
Любые идеи, почему эта переменная сеанса теряется? Если я распечатываю $ _SESSION до того, как вернусь из своего приложения Yii2, оно есть, но затем оно теряется в сеансе после завершения выполнения моего действия?
Мой контроллер завершает выполнение так:
//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
вместо PHPSESSID
который по умолчанию YII. Это вызывало проблему при попытке получить данные сеанса YII2 из Craft и наоборот.
Была решена путем добавления 'phpSessionName' => 'PHPSESSID',
в craftcms general.php.