2012-05-18 8 views
53

En mi código PHP, si una sesión ya ha empezado, y yo trato de empezar una nueva, me sale el siguiente aviso:sesiones de PHP que ya han sido iniciadas

Aviso: Una sesión ya había sido iniciado - ignorando session_start()

¿Cómo puedo evitar esto?

+3

No inicie una nueva sesión si una anterior ¿Esta corriendo? –

+0

posible duplicado de [¿Cómo saber si una sesión está activa?] (Http://stackoverflow.com/questions/3788369/how-to-tell-if-a-session-is-active) - utilice la búsqueda anterior haciendo una pregunta. – hakre

Respuesta

167

Trate

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

Simple y funciona ... eso es todo lo que necesito @valeriyGorbatikov –

1

Debe DE llamado ya el inicio de la sesión tal vez ser llamado de nuevo a través de un include?

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

Un poco tarde, pero por alguna razón esto no funciona. Solo (! Isset ($ _ SESSION)) funciona. – Mave

+2

Riesgo de disparar esto: 'Aviso: Variable indefinida: _SESSION'. Use 'isset' en su lugar. – T30

25

Si quieres uno nuevo, y luego hacer session_destroy() antes de iniciarlo. para comprobar si su conjunto antes de iniciarlo, llame 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 comprobar el mundial $_SESSION en lugar de llamar al método session_status() desde PHP implementa esta función explícitamente a:

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

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

Básicamente, debe verificar si se inició una sesión antes de crear otra; ... more reading.

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

2

Sólo si quieres destruir sesión anterior:

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

o puede utilizar

unset($_SESSION['variable_session _data']) 

para destruir una variable de sesión en particular.

2

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

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

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

0

probar esto

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

Sugiero que usted utilice ob_start(); antes de comenzar cualquier sesson variar, esto debería ordenar el buffer del navegador.

edición: Se ha añadido un extra) después de $ _SESSION

-3

reemplazar session_start(); a

if(!isset($a)) 
{ 

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

} 
+0

Este es un casi duplicado de respuestas que han existido durante años, excepto que el suyo es menos correcto. ¿Qué es '$ a'? Ya puede haberlo establecido en otro lado. La comprobación de '$ _SESSION' tiene mucho más sentido. – moopet

0

Ninguna de las anteriores era adecuado, sin llamar a session_start() en todos los archivos php que dependen de las variables $ sesión a la que no se incluirán. El Aviso es tan molesto y llena rápidamente el Error_log. La única solución que puedo encontrar es que funciona esto ....

error_reporting(E_ALL^E_NOTICE); 
    session_start(); 

Un arreglar el mal, pero funciona.

0

He encontrado este problema al intentar solucionar el comportamiento de bloqueo de $ _SESSION.

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

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

Por lo tanto, de forma predeterminada, una página debe abrir una sesión en modo de solo lectura. Pero una vez que está abierto en solo lectura, tiene que ser cerrado y reabierto 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 

A continuación, cuando se va a escribir algún valor:

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

sería más eficiente:

@session_start(); 

Evitar el gestor de errores en la pantalla

mejor,

Cuestiones relacionadas