Sesiones PHP que ya se han iniciado

81

En mi código PHP, si una sesión ya ha comenzado e intento iniciar una nueva, recibo el siguiente Aviso:

Aviso: ya se había iniciado una sesión, ignorando session_start ()

¿Cómo puedo evitar esto?

usuario1400702
fuente
3
¿No inicie una nueva sesión si se está ejecutando una anterior?
Madara's Ghost
posible duplicado de ¿Cómo saber si una sesión está activa? - utilice la búsqueda antes de hacer una pregunta.
hakre
Para mí funcionó simplemente eliminando session_start (), si la sesión ya se inició, entonces ¿por qué tenemos que iniciarla de nuevo? En mi caso, era solo un archivo config.php que INCLUYE en el código
Mangesh Sathe
Lo puse session_start()en una de mis inclusiones y require_onceen cada archivo que necesito.
nurchi

Respuestas:

245

Tratar

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    } 
?>
Valeriy Gorbatikov
fuente
Esto facilita la implementación de la seguridad si está utilizando una página maestra para envolver todo su contenido.
Raymond Wachaga
Esto también se recomienda para los momentos en los que podría o no cargar el archivo que contiene session_start (), por lo que es una buena práctica estándar
Steve Whitby
29

Si desea uno nuevo, hágalo session_destroy()antes de iniciarlo. Para comprobar si está configurado antes de iniciarlo, llame a 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();
}

Evitaría verificar el global en $_SESSIONlugar de llamar al session_status()método ya que PHP implementó esta función explícitamente para:

Exponer el estado de la sesión a través de la nueva función, session_status Esto es para (PHP> = 5.4.0)

Juan Cortés
fuente
5

Solo si desea destruir la sesión anterior:

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

o puedes usar

unset($_SESSION['variable_session _data'])

para destruir una variable de sesión en particular.

Código espía
fuente
4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

Juego cerrado

Crabthug
fuente
2

Sí, puede detectar si la sesión ya se está ejecutando comprobando isset($_SESSION). Sin embargo, la mejor respuesta es simplemente no llamar session_start()más de una vez.

Debería llamarse muy temprano en su script, posiblemente incluso en la primera línea, y luego no volver a llamarlo.

Si lo tiene en más de un lugar en su código, entonces está solicitando este tipo de error. Córtelo para que esté solo en un lugar y solo se pueda llamar una vez.

Spudley
fuente
1

¿Ya debe haber llamado al inicio de la sesión, tal vez sea llamado nuevamente a través de una inclusión?

if( ! $_SESSION)
{
    session_start();
}  
MikeCruz13
fuente
1
Un poco tarde, pero por alguna razón esto no funciona. Solo funciona (! Isset ($ _ SESSION)).
Mave
2
Correr el riesgo de disparar la siguiente: Notice: Undefined variable: _SESSION. Úselo en su issetlugar.
T30
1

Encontré este problema al intentar corregir el comportamiento de bloqueo de $ _SESSION.

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

El archivo de sesión permanece bloqueado hasta que se completa el script o la sesión se cierra manualmente.

Entonces, de forma predeterminada, una página debería abrir una sesión en modo de solo lectura. Pero una vez que está abierto en modo de solo lectura, debe cerrarse y volver a abrirse para ponerlo en modo de escritura.

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

Luego, cuando vayas a escribir algún valor:

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

La función toma una matriz de pares clave => valor para hacerla aún más eficiente.

TrophyGeek
fuente
0

prueba esto

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

Le sugiero que utilice ob_start (); antes de iniciar cualquier variable de sesson, esto debería ordenar el búfer de su navegador.

editar: Se agregó un extra) después de $ _SESSION

user2521037
fuente
0

Nada de lo anterior fue adecuado, sin llamar a session_start () en todos los archivos php que dependen de las variables $ Session, no se incluirán. El Aviso es tan molesto y llena rápidamente el Error_log. La única solución que puedo encontrar que funciona es esta ...

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

Una mala solución, pero funciona.

Wayne Kirk
fuente
0

Sería más eficiente:

@session_start();

Evitando el manejador de errores en la pantalla

Mejor,

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

Básicamente, debe verificar si se inició una sesión antes de crear otra; ... más lectura .

Por otro lado, eligió destruir una sesión existente antes de crear otra usando session_destroy().

Odinn
fuente
0

Simplemente use la declaración if

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

o

verifique el estado de la sesión con session_status que devuelve el estado de la sesión actual y si la sesión actual ya está funcionando, regrese sin nada más si la sesión no funciona inicie la sesión


session_status() === PHP_SESSION_ACTIVE ?: session_start();
MD SHAYON
fuente