Controlla se la sessione PHP è già iniziata


461

Ho un file PHP che a volte viene chiamato da una pagina che ha avviato una sessione e talvolta da una pagina che non ha avviato la sessione. Pertanto, quando ho session_start()su questo script a volte ricevo il messaggio di errore per "sessione già avviata". Per questo ho messo queste righe:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

ma questa volta ho ricevuto questo messaggio di avviso:

Avviso: variabile non definita: _SESSION

C'è un modo migliore per verificare se la sessione è già iniziata?

Se @session_startlo farò funzionerà correttamente e chiuderà gli avvisi?



Vedi anche le risposte di StackOverflow: stackoverflow.com/questions/1545357/...
contatto-form.co_you_go

Risposte:


761

Modo consigliato per le versioni di PHP> = 5.4.0, PHP 7

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

Riferimento: http://www.php.net/manual/en/function.session-status.php

Per versioni di PHP <5.4.0

if(session_id() == '') {
    session_start();
}

1
Penso che ci sia un problema con la soluzione per PHP <5.4. session_id è impostato la PRIMA volta in cui viene avviata la sessione, ma non viene eliminata alla chiusura della sessione. Ad esempio, se prima del tuo frammento è presente un codice del tipo session_start();session_write_close();: quindi la condizione if fallisce ma non abbiamo una sessione aperta ...
Nicolò Martini,

@Nicolo Martini A quanto ho capito: una sessione iniziata session_start()nella parte superiore di uno script è CHIUSA quando lo script viene chiuso, O quando session_write_closed()viene chiamato prima della chiusura dello script. Vale a dire una sessione CHIUDE quando i suoi dati vengono scritti nel cookie di sessione e la sessione viene sbloccata per l'accesso da un altro script che chiama anche "session_start". CHIUSURA NON significa che la sessione sia DISTRUTTA, quindi. Puoi chiudere una sessione uscendo dallo script corrente o chiamando session_write_close()e puoi riaprirla chiamando session_start(). La mia comprensione, almeno.
Stefan,

1
È ancora un buon modo per iniziare una sessione? Perché nel link non c'è nulla di correlato a questa risposta
csandreas1

@ csandreas1 vedrai dal link la descrizione di session_status e i suoi valori di ritorno attesi. La risposta alla tua domanda è sì!
lovelyramos,

Ho avuto questo fallimento in alcune circostanze - ho usato if (! Isset ($ _ SESSION)) con successo
Scott

161

Per le versioni di PHP precedenti a PHP 5.4.0:

if(session_id() == '') {
    // session isn't started
}

Tuttavia, IMHO, dovresti davvero pensare al refactoring del codice di gestione della sessione se non sai se è stata avviata o meno una sessione ...

Detto questo, la mia opinione è soggettiva e ci sono situazioni (esempi dei quali sono descritti nei commenti seguenti) in cui potrebbe non essere possibile sapere se la sessione è iniziata.


37
Non è necessariamente male non sapere se la sessione è iniziata. Se stai caricando lentamente (iniziando la sessione solo quando è necessario per la prima volta), il test nella tua risposta andrebbe benissimo.
Drewm,

1
Anche in alcuni ambienti apache ha impostato l'avvio automatico della sessione
LeonardChallis

Un esempio per verificare se session_id () restituisce una stringa vuota in un file include:
tgoneil

3
Il commento sulla gestione della sessione di refactoring se non si sa se è inceppato o meno non è davvero rilevante. Ad esempio, se si codificano funzionalità avanzate in un tema WordPress, non si saprà mai se un plug-in ha già iniziato a utilizzare le sessioni senza controllo. Il mondo dei codici non è sempre così bianco e nero: P
Jimbo Jonny il

Mmm, davvero buoni punti. Ammetto che i miei commenti sono molto soggettivi: modificherò la mia risposta per riflettere questo.
Alex

71

PHP 5.4 ha introdotto session_status () , che è più affidabile che fare affidamento session_id().

Considera il seguente frammento:

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

Quindi, per verificare se una sessione è stata avviata, il modo consigliato in PHP 5.4 è ora:

session_status() == PHP_SESSION_ACTIVE

3
Uno snippet di codice che utilizza session_status quando disponibile e metodi precedenti quando non sembrano essere perfetti qui BTW, suggerimento suggerimento :)
Jimbo Jonny

1
Grazie per l'aggiornamento Benjamin. È bene sapere che un nuovo metodo può essere utilizzato a partire da PHP 5.4.
Logan,

1
Questo è un modo molto migliore di controllarlo, non sai sempre se hai avviato una sessione, specialmente quando l'utente cancella i cookie mentre sta navigando nel sito ... Io codice sempre per i 2 anni, tu non so mai cosa faranno gli utenti ;-) Per quanto mi riguarda ho un piccolo file Config.php che viene chiamato su tutti i miei script per impostare variabili e altre informazioni, quindi aggiungendo questo in quel file si assicura sempre che la sessione è avviata se è necessario
Andy Braham l'

35

puoi farlo ed è davvero facile.

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

Spero che sia d'aiuto :)


6
@zloctb: Non riesco a pensare a nessuna situazione in cui farei $_SESSION=array();, quindi questa risposta sembra a posto.
Halfer

5
@halfer Vedi la risposta di Ryan. Se session_destroy()è stato chiamato, è $_SESSIONcomunque possibile impostare. Inoltre, nei test unitari è possibile impostare $_SESSIONdirettamente. Ma ho votato a favore, poiché per la maggior parte delle situazioni pratiche questa risposta dovrebbe essere abbastanza buona (fino a quando PHP 5.3 non sarà più visto ...)
Darren Cook

22
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }

21

Prima di PHP 5.4 non esiste un modo affidabile per sapere se non l'impostazione di una bandiera globale.

Prendere in considerazione:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

O:

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

Quindi, prima di PHP 5.4 dovresti impostare un valore booleano globale.


12

Per tutte le versioni di php

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}

1
Allo stesso modo, si potrebbe anche fareif ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Anthony Hatzopoulos il

9

Verificare questo :

<?php
/**
* @return bool
*/
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();
?>

Fonte http://php.net


6

Usa session_id () , restituisce una stringa vuota se non impostata. È più affidabile che controllare il $_COOKIE.

if (strlen(session_id()) < 1) {
    session_start();
}


5

Questo dovrebbe funzionare per tutte le versioni di PHP. Determina la versione di PHP, quindi controlla se la sessione è avviata in base alla versione di PHP. Quindi, se la sessione non viene avviata, la avvia.

function start_session() {
  if(version_compare(phpversion(), "5.4.0") != -1){
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }
  } else {
    if(session_id() == '') {
      session_start();
    }
  }
}

4

L'unica cosa che devi fare è:

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

Questo è quello che ho usato negli anni. Qualcuno che consiglia di non utilizzare questo? Ovviamente è bene usare un controllo se la sessione viene avviata a volte - in alcuni ambienti apache ha l'impostazione di avvio automatico della sessione, caricamento lento (solo l'avvio della sessione quando è necessario per la prima volta) o semplicemente che a volte è necessario semplicemente effettuare un hack rapido
K Kilian Lindberg,

È LA STESSA RISPOSTA SOPRA (@miyuru)

2

Non sono sicuro dell'efficienza di tale soluzione, ma questo proviene dal progetto di lavoro Questo viene utilizzato anche se è necessario definire la lingua predefinita

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }

2

@ prima che una chiamata di funzione elimini eventuali errori che possono essere segnalati durante la chiamata di funzione.

L'aggiunta di un @prima session_startindica a PHP di evitare la stampa di messaggi di errore.

Per esempio:

L'utilizzo session_start()dopo aver già stampato qualcosa sul browser provoca un errore in modo che PHP visualizzi qualcosa del tipo "Impossibile inviare le intestazioni: iniziato alla (riga 12)", @session_start()in questo caso non riuscirà, ma il messaggio di errore non viene stampato su schermo.

Prima di includere i file o il reindirizzamento a una nuova pagina, utilizzare la exit()funzione, altrimenti verrà visualizzato un errore.

Questo codice può essere utilizzato in tutti i casi:


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>

1

Su PHP 5.3 questo funziona per me:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 

allora hai. Se non si inserisce la frase not at if all'inizio della sessione, la sessione verrà avviata in alcun modo, non è per questo.


1

Risposta BASATA su @Meliza Ramos Response (vedi prima risposta) e http://php.net/manual/en/function.phpversion.php ,

AZIONI:

  • definire PHP_VERSION_ID se non esiste
  • definire la funzione per controllare la versione in base a PHP_VERSION_ID
  • definire la funzione per openSession () sicuro

usa solo openSession ()

    // PHP_VERSION_ID is available as of PHP 5.2.7, if our
    // version is lower than that, then emulate it
    if (!defined('PHP_VERSION_ID')) {
        $version = explode('.', PHP_VERSION);

        define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));


        // PHP_VERSION_ID is defined as a number, where the higher the number
        // is, the newer a PHP version is used. It's defined as used in the above
        // expression:
        //
        // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
        //
        // Now with PHP_VERSION_ID we can check for features this PHP version
        // may have, this doesn't require to use version_compare() everytime
        // you check if the current PHP version may not support a feature.
        //
        // For example, we may here define the PHP_VERSION_* constants thats
        // not available in versions prior to 5.2.7

        if (PHP_VERSION_ID < 50207) {
            define('PHP_MAJOR_VERSION',   $version[0]);
            define('PHP_MINOR_VERSION',   $version[1]);
            define('PHP_RELEASE_VERSION', $version[2]);

            // and so on, ...
        }
    }

    function phpVersionAtLeast($strVersion = '0.0.0')
    {
        $version = explode('.', $strVersion);

        $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];

        if(PHP_VERSION_ID >= $questionVer)
            return true;
        else
            return false;

    }

    function openSession()
    {
        if(phpVersionAtLeast('5.4.0'))
        {
            if(session_status()==PHP_SESSION_NONE)
                session_start();
        }
        else // under 5.4.0
        {
            if(session_id() == '')
                session_start();
        }
    }

1
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

In realtà, ora è troppo tardi per spiegarlo qui come è stato risolto. Questo era un file .inc di uno dei miei progetti in cui si configura un menu per un ristorante selezionando un piatto e rimuovendo / aggiungendo o cambiando l'ordine. Il server su cui stavo lavorando non aveva la versione attuale, quindi l'ho resa più flessibile. Sta agli autori che desiderano utilizzarlo e provarlo.


1

Questo frammento di codice funziona per te?

if (!count($_SESSION)>0) {
    session_start();
}

0

È necessario riorganizzare il codice in modo da chiamare session_start()esattamente una volta per esecuzione della pagina.


4
chiamarlo esattamente una volta per esecuzione della pagina potrebbe non essere desiderato in alcune situazioni.
Timo Huovinen,

Se stai uccidendo la sessione per ricrearla, allora certo, ma questo è un caso speciale. In generale, l'applicazione dovrebbe avere il codice che viene eseguito all'inizio una volta, che è dove va il session_start ().
SamT

1
ad esempio, un'applicazione memorizza le sessioni su un file e deve caricare 2 richieste lente simultanee di dati, nessuna di queste richieste necessita di sessioni, ma una bloccherà l'altra perché session_start blocca il file della sessione.
Timo Huovinen,

Esattamente. @YuriKolovsky ha ragione. La domanda di Alex è pertinente perché questi casi possono accadere e non sono rari.
Paulo Coghi - Ripristina Monica

14
-1, la maggior parte dei siti Web sono basati su CMS e presentano elementi come temi e plug-in, spesso scritti da parti diverse, senza mai sapere se il codice dell'altro ha avviato sessioni o meno. L'implicazione che questo è solo un problema di organizzazione del codice è falsa.
Jimbo Jonny,

0
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}

0

PHP_VERSION_ID è disponibile da PHP 5.2.7, quindi controlla prima questo e, se necessario, crealo . session_statusè disponibile da PHP 5.4, quindi dobbiamo controllare anche questo:

if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);
    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
    $version = PHP_VERSION_ID;
}
if($version < 50400){
    if(session_id() == '') {
        session_start();
    }
}else{
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
}


0

ho finito con un doppio controllo dello stato. php 5.4+

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};

0

È possibile utilizzare la seguente soluzione per verificare se una sessione PHP è già stata avviata:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}

La risposta valida è più dettagliata.
Clément Prévost,

0

Questo è ciò che uso per determinare se una sessione è iniziata. Usando empty ed isset come segue:

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

-3

Sostituisci session_start();con:

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

contiene errori di codice e funzionerebbe solo se lo stesso file fosse incluso più volte, ma non all'interno di una chiusura.
Banana Acid,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.