Обработка PHP SESSION - неверные значения - PullRequest
0 голосов
/ 19 февраля 2019

Нам нужно использовать session_write_close () внутри множества существующих кодов.Но это выглядит опасно для нас, потому что PHP делает следующее - без каких-либо предупреждений или ошибок:

session_name('goodoldasdf');
session_start();

if (!empty($_SESSION['var'])) {
print ' Session-Data: '. $_SESSION['var'];
}

$_SESSION['var'] = "before";

session_write_close();

$_SESSION['var'] = "after"; // notice: definition after write close!

print ' B: '. $_SESSION['var'];

Когда мы определяем SESSION-var после session_write_close, PHP не записывает SESSION в обработчик сеанса MemcacheD(как и ожидалось), но он все еще использует перезапись в той же самой среде выполнения сценария.

Вывод: "Pseudo-Session-Data: после ".

второй прогон:

Вывод: "Данные сеанса: до Данные псевдосеанса: после "

Вопрос в следующем: Как убедиться, что PHP не использует псевдо SESSION-переменных, которые фактически не записываются в сессии? Есть ли способ получить предупреждения PHPВот?Или есть какие-либо предложения по решению этой проблемы?


Почему нам нужно добавлять закрывающую запись везде: После обновления «PHP 5.x» до «PHP 7» все замедляется.Особенно на AJAX-запросах или одновременной загрузке мульт-вкладок.Это потому, что PHP 7, похоже, меняет свою обработку / блокировку SESSION.

Очень хорошая демонстрация: https://demo.ma.ttias.be/demo-php-blocking-sessions/

Так что нам нужно добавить session_write_close для большого количества сценариев - без риска недопустимых сеансов -значения.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вместо session_write_close(); напишите свою собственную функцию и отключите суперглобальный:

function session_stop() {
    session_write_close();
    unset($_SESSION);
}

Теперь вы получите:

Примечание: неопределенная переменная: _SESSION в строке файла XY

0 голосов
/ 19 февраля 2019

Вы можете посмотреть на вывод session_status() ( Документы )

switch(session_status()) {
    case PHP_SESSION_DISABLED:
        die('Sessions disabled on this server');
    case PHP_SESSION_NONE:
        die('Session has not been started, or has been closed');
    case PHP_SESSION_ACTIVE:
        die('There is currently an active session');
}

Вы можете использовать это с функцией-оберткой для получения / установки переменных сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...