2010-04-05 15 views

Respuesta

22

De the docs:

A partir de PHP 4.3.3, llamando session_start() después de que la sesión se haya iniciado anteriormente dará como resultado un error del nivel E_NOTICE. Además, el inicio de la segunda sesión simplemente se ignorará.

Así que no, no "causará daño", pero arrojará un error. Y el hecho de que esté sucediendo es probablemente un indicador de que estás haciendo algo incorrectamente y tal vez necesites volver a pensar cómo se presenta tu código.

48

A partir de PHP 4.3.3, la llamada a session_start() mientras la sesión ya se ha iniciado dará como resultado una advertencia E_NOTICE. La segunda llamada a session_start() será simplemente ignored.You podría comprobar si la sesión se ha iniciado o no con la primera:

if (session_id() == "") 
    session_start(); 
4

lectura de la documentación para session_start, todo lo que puedo ver es:

A partir de PHP 4.3.3, llamando session_start() después de la sesión se inició con anterioridad dará lugar a un error de nivel E_NOTICE. Además, el inicio de la segunda sesión simplemente se ignorará.

Por lo tanto, obtendrá un E_NOTICE y será ignorado.

1

Si la sesión ya está abierta, se devolverá un aviso de error y se ignorará la nueva sesión. Así que no se hace daño, pero tendrás un error molesto.

Pero ... si encuentra la necesidad de hacerlo, podría ser un síntoma de que su código no está bien organizado. Probablemente sea en su beneficio ver cómo puede evitar repetir tareas redundantes, como comenzar una sesión.

2

Normalmente coloco una instrucción de inicio de sesión en un archivo de inclusión que requiero_un inicio. Pero no creo que haya un problema con múltiples llamadas.

11

Llamando session_start(); puede dañar el rendimiento de su aplicación.

El siguiente código desencadenar un E_NOTICE, pero no dañará mucho a rendimiento

<?php 
session_start(); 
session_start(); 
?> 

Pero llamar a la siguiente perjudicará el rendimiento! Pero sigue siendo útil. Si tiene un script que tarda como 3 minutos en ejecutarse, se lo llama con XHR (js). En este caso, es útil usar session_write_close. de lo contrario, la solicitud al servidor se bloquea hasta que se liberen las sesiones. Podría suceder que desee utilizar las sesiones al inicio del guión y al final del guión.

<?php 
session_start(); 
session_write_close(); 
session_start(); 
?> 

Pero cuando llama al session_start(); toda la información se deserializa, y cuando se llama a session_write_closed() se serializa. ¡Entonces, si tiene muchos datos, puede ser realmente lento!

La siguiente prueba muestra cuánto impacto tiene.

1,0130980014801 sesion_start + cercano con sesión vacía

1,0028710365295 bucle normal sin sesión

12,808688879013 unos datos del lote en la sesión con arranque + cerca

1,0081849098206 bucle normal de nuevo (inútil un poco)

<?php 
//start and clear first session 
session_start(); 
session_destroy(); 
session_write_close(); 

//test one 
if(true) { 
    //test loop one 
    $start = microtime(true); 
    for($i = 0; $i < 1000; $i++) { 
     session_start(); 
     usleep(100); 
     session_write_close(); 
    } 
    $end = microtime(true); 
    echo($end - $start); 


    //test loop 2 
    echo('<br />'); 
    $start = microtime(true); 
    for($i = 0; $i < 1000; $i++) { 
     usleep(100); 
    } 
    $end = microtime(true); 
    echo($end - $start); 
} 


//fill the array with information so serialization is needed 
session_start(); 
$_SESSION['test'] = array(); 
for($i = 0; $i < 10000; $i++) { 
    $_SESSION['test'][$i] = chr($i); 
} 
session_write_close(); 
echo('<br />'); 

//test two 
if(true) { 
    //test loop one 
    $start = microtime(true); 
    for($i = 0; $i < 1000; $i++) { 
     session_start(); 
     usleep(100); 
     session_write_close(); 
    } 
    $end = microtime(true); 
    echo($end - $start); 


    //test loop 2 
    echo('<br />'); 
    $start = microtime(true); 
    for($i = 0; $i < 1000; $i++) { 
     usleep(100); 
    } 
    $end = microtime(true); 
    echo($end - $start); 
} 
?> 
1

Si produce un error, es probable que los desarrolladores no tengan la intención de realizar esa acción en particular t o ocurrir. Así que, sí, a pesar de lo que te muestra W3Schools, técnicamente es una "mala" cosa que hacer.

Entonces, en lugar de ir a lo seguro y tratar de configurar la sesión en cada página, ¿por qué no primero verifique si la sesión existe antes de seguir adelante?

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

Personalmente, comprueba primero la existencia de la cookie de la sesión.

-1

`siempre use esto para la inclusión del archivo de encabezado y pie de página en php. inicia sesión en ambas páginas pero usa esto then session_start()

if (! isset ($ _ SESSION)) {session_start(); } `

Cuestiones relacionadas