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.
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();
}elseif($status == PHP_SESSION_DISABLED){
//Sessions are not available
}elseif($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)
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.
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
*/functionOpenSessionReadOnly() {
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
*/functionWriteSessionValues($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.
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 ...
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_start()
en una de mis inclusiones yrequire_once
en cada archivo que necesito.Respuestas:
Tratar
<?php if(!isset($_SESSION)) { session_start(); } ?>
fuente
Si desea uno nuevo, hágalo
session_destroy()
antes de iniciarlo. Para comprobar si está configurado antes de iniciarlo, llame asession_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
$_SESSION
lugardellamar alsession_status()
método ya que PHP implementó esta función explícitamente para:fuente
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.
fuente
Juego cerrado
fuente
Sí, puede detectar si la sesión ya se está ejecutando comprobando
isset($_SESSION)
. Sin embargo, la mejor respuesta es simplemente no llamarsession_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.
fuente
¿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(); }
fuente
Notice: Undefined variable: _SESSION
. Úselo en suisset
lugar.Encontré este problema al intentar corregir el comportamiento de bloqueo de $ _SESSION.
http://konrness.com/php5/how-to-prevent-blocking-php-requests/
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.
fuente
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
fuente
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 ...
Una mala solución, pero funciona.
fuente
Sería más eficiente:
Evitando el manejador de errores en la pantalla
Mejor,
fuente
<?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()
.fuente
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
fuente