2012-05-18 17 views
53

Nel mio codice PHP, se una sessione è già iniziata, e io cerco di iniziarne una nuova, ottengo il seguente avviso:sessioni PHP che sono già state iniziate

Avviso: Una sessione era già stato avviato - ignorando session_start()

Come posso evitare questo?

+3

Non avviare una nuova sessione se una vecchia sta correndo? –

+0

possibile duplicato di [Come sapere se una sessione è attiva?] (Http://stackoverflow.com/questions/3788369/how-to-tell-if-a-session-is-active) - si prega di utilizzare la ricerca prima fare una domanda – hakre

risposta

167

Prova

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

Semplice e funziona ... questo è tutto ciò di cui ho bisogno @valeriyGorbatikov –

1

Devi della già chiamato l'inizio della sessione forse essere chiamato di nuovo attraverso un include?

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

Un po 'tardi, ma per qualche ragione questo non funziona. Solo (! Isset ($ _ SESSION)) funziona. – Mave

+2

Rischio per attivare questo: 'Avviso: variabile non definita: _SESSION'. Usa invece 'isset'. – T30

25

Se si desidera uno nuovo, fare session_destroy() prima di avviarlo. Per verificare se il suo set prima di iniziarlo, chiamare 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(); 
} 

Vorrei evitare il controllo del globale $_SESSION invece di chiamare il metodo session_status() da PHP implementata questa funzione in modo esplicito a:

Expose stato della sessione via nuova funzione, session_status Questo è per (PHP> = 5.4.0)

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

Fondamentalmente, è necessario verificare se una sessione è stata avviata prima di crearne un'altra; ... more reading.

D'altra parte, si è scelto di distruggere una sessione esistente prima di crearne un'altra utilizzando session_destroy().

2

Solo se si vuole distruggere sessione precedente:

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

oppure è possibile utilizzare

unset($_SESSION['variable_session _data']) 

per distruggere una variabile di sessione particolare.

2

Sì, è possibile rilevare se la sessione è già in esecuzione controllando isset($_SESSION). Tuttavia la migliore risposta è semplicemente non chiamare session_start() più di una volta.

Dovrebbe essere chiamato molto presto nel tuo script, forse anche nella prima riga, e quindi non richiamato.

Se lo hai in più di un posto nel tuo codice, allora stai chiedendo di ottenere questo tipo di bug. Tagliarlo in modo che sia solo in un posto e possa essere chiamato una sola volta.

0

provare questo

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

io suggerisco di utilizzare ob_start(); prima di iniziare qualsiasi sesson variabile, questo dovrebbe ordinare il buffer del browser.

edit: aggiunto un extra) dopo $ _SESSION

-3

sostituire session_start(); a

if(!isset($a)) 
{ 

$a = False; 
if($a == TRUE) 
{ 
    session_start(); 
    $a=TRUE; 
} 

} 
+0

Questo è un quasi duplicato di risposte che esistono da anni, tranne il tuo è meno corretto. Qual è '$ a' - potresti averlo già impostato altrove. Il controllo di '$ _SESSION' ha molto più senso. – moopet

0

Nessuno dei precedenti era adatto, senza chiamare session_start() in tutti i file php che dipendono da variabili di sessione $ che non saranno inclusi. L'avviso è così fastidioso e riempie rapidamente l'Error_log. L'unica soluzione che riesco a trovare funziona è questa ...

error_reporting(E_ALL^E_NOTICE); 
    session_start(); 

Una brutta soluzione, ma funziona.

0

Ho riscontrato questo problema durante il tentativo di correggere il comportamento di blocco di $ _SESSION.

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

Il file sessione rimane bloccata fino al completamento dello script o la sessione viene chiusa manualmente.

Quindi, per impostazione predefinita, una pagina dovrebbe aprire una sessione in modalità di sola lettura. Ma una volta aperto in sola lettura, deve essere chiuso e riaperto in modalità di scrittura.

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 

Poi quando si va a scrivere un certo valore:

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

sarebbe più efficiente:

@session_start(); 

Evitare gestore degli errori nella schermata

migliore,

Problemi correlati