2010-09-12 9 views

Respuesta

22

??. el valor es 5.

puede generar una gran cantidad más cabeceras que sólo Location cabeceras con header, la mayoría de los cuales no desea detener su ejecución de código. Si desea detener la ejecución de código, es necesario llamar exit explícitamente.

+0

morir() tiene el mismo efecto. –

2

por supuesto 5. Hay que añadir la salida() después de una cabecera tales

2

El comando header no interrumpe el flujo de su código. Incluso si se encuentra, el navegador aún descarga su página, incluso si no se muestra. Considere 404 páginas, que (a pesar de ser errores) aún son procesadas por el navegador (aunque se representan mientras que las redirecciones no lo son).

3

Una vez que emite el encabezado, ha comenzado una carrera entre su código y el servidor web/navegador. En general, tan pronto como el navegador reciba la redirección, cerrará la conexión que ejecutó el script y comenzará a conectarse a la nueva URL de redireccionamiento. Cuando la conexión está cerrada, el servidor web generalmente intentará eliminar el script.

Puede tener suerte y poder terminar cualquier otra cosa que desee hacer, o puede que tenga mala suerte y el guión ni siquiera podrá llegar a la siguiente línea después de la llamada header().

Existe la función ignore_user_abort(), que debería permitir que su script continúe independientemente del estado de la conexión.

+1

No, todavía descarga toda la respuesta, incluso si tiene un encabezado de ubicación. Es por eso que debe llamar a 'exit;' después del encabezado si desea redirigir sin ejecutar más código. Si fuera aleatorio si ejecutó o no el código restante, entonces esa no sería una característica muy útil, ¿verdad? –

+0

no sería una característica. Sería un pequeño error divertido recordar que los navegadores funcionan de esa manera. por supuesto, no lo hacen. – muhmuhten

+0

@TorValamo No estoy seguro de que sea del todo exacto. He estado trabajando en un proyecto donde configuré el encabezado de ubicación sin salir después, y localmente, el código no se ejecutó después, mientras que cuando se envió a un servidor de desarrollo para probarlo, ¡el código se estaba ejecutando! – billyonecan

4

Siempre debe morir() o salir() después de la redirección (o como lo señala Mark B, use ignore_user_abort()) porque de otra manera no sabrá con certeza qué sucederá.

Aunque algunos códigos se ejecutarán después de redireccionar una ubicación de encabezado, es importante tener en cuenta que no todos los códigos posteriores se ejecutarán necesariamente.

Según su ejemplo, sí, some_value será igual a 5. Pero en algún momento el script se terminará prematuramente.

Tome el ejemplo siguiente:

session_start(); 
$_SESSION["some_value"] = 'original value'; 
header("Location: /index.php/test2"); 

$start_time = microtime(true); 

for($i = 0; $i <= 100000; $i ++) 
{ 
    password_hash($i); // slow it down 
    $_SESSION["some_value"] = $i; 
    $_SESSION['time'] = microtime(true) - $start_time; 
} 

$_SESSION['some_value'] = 'finished!'; 

Si todas las otras respuestas eran correctas, asumirás $ _SESSION [ 'some_value'] sería igual a 'terminado!' - pero ejecuté el código y este no es el caso.

Aquí están mis resultados:

some_value: 174 
time: 0.0026998519897461 

de prueba de dos:

some_value: 218 
time: 0.0033109188079834 

de prueba de tres:

some_value: 218 
time: 0.0035371780395508 

juicio de cuatro:

some_value: 174 
time: 0.0026431083679199 

de prueba de cinco:

some_value: 174 
time: 0.0027921199798584 

Si implemento ignore_user_abort (TRUE); en el script anterior, entonces some_value iguala "finished!" así que tenlo en cuenta si tienes la intención de hacer algo crítico como el registro o consultas de bases de datos o el envío de correos electrónicos después de la redirección.

Cuestiones relacionadas