web-dev-qa-db-fra.com

PHP 7.2 Avertissement: "Impossible de changer le nom de la session quand celle-ci est active"

Depuis PHP sur notre serveur, la version 7.0 est passée de 7.0 à 7.2. Je reçois l'avertissement suivant (ce qui entraîne une erreur) si un nouveau déploiement est effectué. La raison en est probablement que les anciennes sessions ne sont plus valides après le déploiement.

Avertissement: nom_session (): Impossible de modifier le nom de la session lorsque la session est actif dans /var/www/html/model/login/lib/Session.class.php à la ligne 137

Avertissement: session_set_cookie_params (): Impossible de modifier le cookie de session paramètres lorsque la session est active dans /var/www/html/model/login/lib/Session.class.php à la ligne 138

Avertissement: impossible de modifier les informations d'en-tête - les en-têtes déjà envoyés par (la sortie a commencé à /var/www/html/model/login/lib/Session.class.php:137) in /var/www/html/model/login/lib/Session.class.php à la ligne 142

Il semble que PHP 7.2 soit devenu plus strict dans le contexte de session et dans un certain contexte. Le serveur semble reconnaître les sessions non valides et tente de les détruire. Cela fait partie de la classe 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();
    }
}

Qu'est-ce qui a changé dans PHP en ce qui concerne les sessions? 

Pourquoi est-il interdit de définir un nom de session si une autre session est active (en fonction de la documentation avec nom_session je pourrais changer de session et démarrer plusieurs sessions)?

Et comment puis-je détruire la session en cours de manière appropriée?

En faisant des recherches plus poussées, j'ai également trouvé la discussion suivante sur GitHub ( https://github.com/Icinga/icingaweb2/issues/3185 ). Ils confirment que cette erreur a été introduite avec PHP 7.2. Malheureusement, il n'y a pas non plus de réponse: - /

8
Blackbam

J'ai rédigé un rapport de bogue sur php.net et ils m'ont expliqué qu'il ne s'agissait pas d'un bogue. Oui dans PHP 7.2 un avertissement est généré maintenant. Cependant, cela n'a jamais fonctionné comme prévu, il vient d'échouer en silence.

Pour créer plusieurs sessions, il est nécessaire d'utiliser session_id(). Examinez cette question connexe: PHP Comment créer plusieurs sessions?

session_name() ainsi que session_set_cookie_params() sont toujours inutiles si la session est déjà en cours d'exécution. 

Pour la réponse originale, regardez ici: https://bugs.php.net/bug.php?id=75650&thanks=2

7
Blackbam

J'ai eu un problème similaire, mais j'ai finalement trouvé un moyen de passer. Le code ci-dessous était ma première approche qui m'a donné des erreurs.

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();
    }
}

Maintenant, les versions précédentes de php ont négligé notre erreur (Nous étions pratiquement en train de renommer et de donner à une session qui existe déjà des propriétés qui sont très mauvaises. Alors, comment ai-je résolu ce problème?

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();
         }    
    }

Je lie maintenant la session_set_cookie_params() juste avant le début de la session et je vérifie si la session existe déjà avant de le faire.

3
Miracool