web-dev-qa-db-fra.com

PHP sessions déjà démarrées

Dans mon PHP code), si une session a déjà commencé et que j'essaie d'en démarrer une nouvelle, je reçois l'avis suivant:

Remarque: une session a déjà été démarrée - ignorer session_start ()

Comment puis-je éviter ça?

71
user1400702

Essayer

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    } 
?>
217

Si vous en voulez un nouveau, faites alors session_destroy() avant de le démarrer. Pour vérifier si elle est définie avant de la démarrer, appelez session_status() :

$status = session_status();
if($status == PHP_SESSION_NONE){
    //There is no active session
    session_start();
}else
if($status == PHP_SESSION_DISABLED){
    //Sessions are not available
}else
if($status == PHP_SESSION_ACTIVE){
    //Destroy current and start new one
    session_destroy();
    session_start();
}

Je voudrais éviter de vérifier le global $_SESSION À la place de J'appelle la méthode session_status() depuis PHP a explicitement implémenté cette fonction pour:

Exposer le statut de la session via une nouvelle fonction, statut_session Ceci est pour (PHP> = 5.4.0)

28
Juan Cortés

Seulement si vous voulez détruire la session précédente:

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    }
    else
    {
        session_destroy();
        session_start(); 
    }
?>

ou vous pouvez utiliser

unset($_SESSION['variable_session _data'])

pour détruire une variable de session particulière.

4
Code Spy

Oui, vous pouvez détecter si la session est déjà en cours en vérifiant isset($_SESSION). Cependant, la meilleure solution consiste simplement à ne pas appeler session_start() plus d'une fois.

Il doit être appelé très tôt dans votre script, éventuellement même à la première ligne, puis ne plus être appelé.

Si vous l'avez à plus d'un endroit dans votre code, vous demandez alors d'obtenir ce type de bogue. Coupez-le afin qu'il ne soit qu'à un endroit et ne puisse être appelé qu'une seule fois.

2
Spudley

Vous devez déjà appeler le début de la session peut-être être appelé à nouveau via un include?

if( ! $_SESSION)
{
    session_start();
}  
1
MikeCruz13

Ce serait plus efficace:

@session_start();

Eviter le gestionnaire d'erreurs à l'écran

Meilleur,

0
Jos3

J'ai rencontré ce problème en essayant de corriger le comportement bloquant de $ _SESSION.

http://konrness.com/php5/how-to-prevent-blocking-php-requests/

Le fichier de session reste verrouillé jusqu'à la fin du script ou la fermeture manuelle de la session.

Ainsi, par défaut, une page doit ouvrir une session en mode lecture seule. Mais une fois ouvert en lecture seule, il doit être fermé et rouvert en écriture.

const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;

/**
 * Open _SESSION read-only
 */
function OpenSessionReadOnly() {
    session_start([
                      'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
                      'read_and_close'  => true,    // READ ACCESS FAST
                  ]);
    // $_SESSION is now defined. Call WriteSessionValues() to write out values
}

/**
 * _SESSION is read-only by default. Call this function to save a new value
 * call this function like `WriteSessionValues(["username"=>$login_user]);`
 * to set $_SESSION["username"]
 *
 * @param array $values_assoc_array
 */
function WriteSessionValues($values_assoc_array) {
    // this is required to close the read-only session and 
    // not get a warning on the next line.
    session_abort();

    // now open the session with write access
    session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);

    foreach ($values_assoc_array as $key => $value) {
        $_SESSION[ $key ] = $value;
    }
    session_write_close();  // Write session data and end session

    OpenSessionReadOnly(); // now reopen the session in read-only mode.
}

OpenSessionReadOnly();  // start the session for this page

Ensuite, quand vous allez écrire une valeur:

WriteSessionValues(["username"=>$login_user]);
0
TrophyGeek

Aucune de ces réponses ne convenait, sans appeler session_start () dans tous les fichiers php dépendant de variables de session, ils ne seront pas inclus. La notice est tellement ennuyeuse et remplit rapidement le Error_log. La seule solution que je peux trouver qui fonctionne est la suivante ...

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

Une mauvaise solution, mais ça marche.

0
Wayne Kirk

essaye ça

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

Je vous suggère d'utiliser ob_start (); avant de commencer toute variable de session, cela devrait commander la mémoire tampon de votre navigateur.

edit: ajouté un extra) après $ _SESSION

0
user2521037
<?php
if ( session_id() != "" ) {
    session_start();
}

En gros, vous devez vérifier si une session a été démarrée avant d'en créer une autre. ... plus de lecture .

D'autre part, vous avez choisi de détruire une session existante avant d'en créer une autre en utilisant session_destroy() .

0
Odinn