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?


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

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)


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.


4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

Juego cerrado


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.


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

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.


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


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.


0

Sería más eficiente:

@session_start();

Evitando el manejador de errores en la pantalla

Mejor,


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().


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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.