it-swarm.com.ru

PHP 7.2 Предупреждение: "Невозможно изменить имя сеанса, когда сеанс активен"

Поскольку PHP на нашем сервере была обновлена ​​до 7,2 с 7,0. Я получаю следующее предупреждение (которое приводит к ошибке), если выполняется новое развертывание. Возможно, причина в том, что старые сеансы становятся недействительными после развертывания.

Предупреждение: session_name (): Невозможно изменить имя сеанса, когда сеанс активен в /var/www/html/model/login/lib/Session.class.php в строке 137

Предупреждение: session_set_cookie_params (): Невозможно изменить cookie сессии параметры, когда сессия активна в /var/www/html/model/login/lib/Session.class.php в строке 138

Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с /var/www/html/model/login/lib/Session.class.php:137) в /var/www/html/model/login/lib/Session.class.php в строке 142

Кажется, что PHP 7.2 стал более строгим в контексте сеансового греха в определенном контексте. Кажется, сервер распознает недопустимые сеансы и пытается их уничтожить. Это часть класса Session:

/**
 * Secure instant destruction of session. Must be called after session_start !
 */
public static function destroyAbsolute() {

    self::checkInit(); // unimportant

    session_name(self::$name); // this is line 137
    session_set_cookie_params(0, COOKIEPATH, null, self::$force_ssl_cookie, true);

    if(session_id()) {
        if (isset($_COOKIE[session_name()])) {
            setcookie(session_name(), "", time() - 42000, COOKIEPATH);
        }
        unset($_COOKIE[session_name()]);
        session_destroy();
    }
}

Что изменилось в PHP в отношении сессий? 

Почему нельзя устанавливать имя сеанса, если активен другой сеанс (в соответствии с документами с именем_сессии, я могу изменить сеанс и запустить несколько сеансов)?

И как я могу соответствующим образом уничтожить запущенную сессию?

Проводя дальнейшие исследования, я также обнаружил следующее обсуждение GitHub ( https://github.com/Icinga/icingaweb2/issues/3185 ). Они подтверждают, что эта ошибка была введена в PHP 7.2. К сожалению, также нет ответа: - /

8
Blackbam

Я сделал отчет об ошибке на php.net, и они объяснили, что это не ошибка. Да, в PHP 7.2 теперь генерируется предупреждение. Однако это никогда не работало так, как задумано, это просто молча провалилось.

Для создания нескольких сессий необходимо использовать функцию session_id(). Посмотрите на этот связанный вопрос: PHP Как я могу создать несколько сессий?

session_name(), а также session_set_cookie_params() всегда не нужны, если сеанс уже запущен. 

Для оригинального ответа посмотрите здесь: https://bugs.php.net/bug.php?id=75650&thanks=2

7
Blackbam

У меня была похожая проблема, но в конце концов я нашел выход. Код ниже был мой первый подход, который дал мне ошибки.

static function startmysession($lifetime, $path, $domain, $secure, $httponly){

    session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly);
    session_regenerate_id(true);

    if(!isset($_SESSION)){
        session_start();
    }
}

Более ранние версии php упустили из виду нашу ошибку (мы практически переименовывали и давали сеанс с уже существующими свойствами, что очень неправильно. Так как я решил эту проблему?

static function startmysession($lifetime, $path, $domain, $secure, $httponly){      
    if(!isset($_SESSION)){  
         session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly);
         @session_regenerate_id(true);    
             session_start();
         }    
    }

Теперь я связываю функцию session_set_cookie_params() непосредственно перед началом сеанса, и проверяю, существует ли сеанс, прежде чем делать это.

3
Miracool