2011-12-18 27 views
9

Aparece "Falló la destrucción del objeto de sesión" cuando uso session_destroy().¿Por qué falló la destrucción de objetos de sesión?

session_start(); 
if(isset($_SESSION['user_id'])){  
    $_SESSION=array(); 
    if(isset($_COOKIE[session_name()])){ 
     setcookie(session_name(),'',0,"/"); 
    } 
    session_destroy(); 
} 

¿Qué causa este error?

+3

¿Por qué quiere suprimir el error, en lugar de corregirlo? –

+0

quizás debido a '$ _SESSION = array();' o llamando 'session_name()' before 'session_start()'? no estoy seguro de cuál es el correcto ... – LeleDumbo

+0

Solo las primeras dos líneas tienen sentido, el resto del código es desconcertante. No creo que entiendas cómo funciona $ _SESSION. Simplemente llame a session_start() y úselo. – rook

Respuesta

14

error:

Warning: session_destroy(): Session object destruction failed

es bastante trivial, no hay ninguna sesión se ha iniciado objeto ha sido comitted, por lo que no puede destruirlo.

El operador @ no siempre está activo, p. con funciones de informe de errores.

Editar:

1) What causes this error?

Este error es causado normalmente cuando PHP intenta eliminar el archivo de sesión, pero no lo encuentra.

En su caso con session_destroy solo hay one place in PHP que causa esto. Ahí es cuando el session.save_handler (consulte también session_set_save_handler) devuelve FALSE para la acción destroy. Esto depende de qué tipo de manejador de guardado uses, el predeterminado es archivos. Con eso, cuando la configuración session.save_path es incorrecta (por ejemplo, no es un directorio accesible), esto causaría tal error.

2) Why would the "@" not be suppressing the error?

Eso depende de cómo se crea la salida y en la configuración de PHP. @ no siempre funciona. Por ejemplo, las devoluciones de llamada registradas con set_error_handler seguirán recibiendo estos mensajes.

+1

Hay, al menos técnicamente, un derecho 'session_start()' en la parte superior del código citado. –

+0

Quizás iniciado, pero aún no realizado, vea ['session_commit'] (http://php.net/session_commit). – hakre

+0

Entonces la respuesta es 'session_write_close()' antes de 'session_destroy()' ...? –

0

En mi caso, estaba intentando destruir la sesión antes de que se creara la cookie. En otras palabras lo que hice algo como:

session_start(); 
... 
session_destroy(); 

Así que el servidor no tiene la oportunidad de 'contacto' con el navegador antes de destruir la sesión. solución simple que trabajó para mí era

session_start(); 
... 
$_SESSION=array(); 
0

Si está utilizando un cargador automático, que puede estar fallando para cargar una clase que está guardado en la sesión.

Cuestiones relacionadas