Сессия Yii2 потеряна после завершения действия контроллера

Я пытаюсь запустить приложение 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?

0

Решение

Я никогда не использую 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);
0

Другие решения

Я смог решить эту проблему.

Проблема в том, что CraftCMS использует другой session.name который установлен в CraftSessionId вместо PHPSESSID который по умолчанию YII. Это вызывало проблему при попытке получить данные сеанса YII2 из Craft и наоборот.

Была решена путем добавления 'phpSessionName' => 'PHPSESSID', в craftcms general.php.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector