2010-08-26 17 views
7

Encontré algo extraño mientras migraba a mi nuevo servidor.Capaz de eco antes del encabezado()

Tengo un script que redireccionará a los usuarios a otra página web según ciertas condiciones. Lo que estaba haciendo, sin embargo, es hacer eco de 'Redirigir ...', luego usar la función de encabezado() para redirigir realmente. Así es como se veía el código:

if($condition) { 
    echo 'Redirecting...'; 
    header('Location: ' . $url); 
} 

Ahora sólo me di cuenta de que esto es incorrecto después de cambiar a nuestro nuevo servidor, probado, y vio que no sería redirigir simplemente redirigir la salida ... y una vez que buscó al respecto, aprendió que no puede haber ningún tipo de salida (a menos que use ob_start, etc.) antes de usar la función de encabezado().

La pregunta es, ¿por qué este código, que NO debería funcionar en CUALQUIER instalación de PHP, funciona en mi servidor anterior? Redirigirá con el echo before header() sin problema.

Gracias!

+1

Creo que se puede activar el almacenamiento temporal de datos por defecto en su php.ini. El lado negativo es que toda la solicitud debe completarse antes de que se envíe cualquier salida al usuario. – meagar

Respuesta

9

Es posible que haya activado el almacenamiento en búfer de salida en el servidor anterior: el almacenamiento en búfer de salida no generará nada hasta que el script termine de ejecutarse. Eso le permite sacar el encabezado antes de la salida real (ya que sabe que los encabezados deben enviarse primero).

Si eso tiene sentido.

+0

¡Gracias! ese parece ser el problema que acabo de comprobar php.ini en el servidor anterior y output_buffering está configurado en 4096 por lo que estaba activado :) –

1

Funcionó en su antiguo servidor ya que tenía el búfer de salida activado por defecto, establecido por php.ini.

+0

¡Gracias! ¡Lo aprecio! –

4

Tal vez su instalación anterior tenía output_buffering definido como verdadero en php.ini. Esto retrasó la salida permitiéndole configurar los encabezados incluso después de hacer eco.

+0

¡Gracias! ¡Lo aprecio! –

3

Debe haber activado el almacenamiento en búfer, incluso si no lo hizo activamente. output_buffering = On en php.ini?

+0

¡Gracias! ¡Lo aprecio! –

0

El servidor anterior probablemente tenía habilitado el almacenamiento en búfer de salida de forma predeterminada. Esto significaba que no sería echo de inmediato, sino más bien esperar hasta que todo el script haya terminado, y luego echo. Esto también significa que el encabezado se enviaría antes del echo (ya que se almacenó en el búfer) y, por lo tanto, no daría lugar a una advertencia.

En el nuevo servidor, lo más probable es que no tenga habilitado el almacenamiento en búfer de salida de forma predeterminada, y esto significa que echo lo hará inmediatamente, sin almacenarlo en búfer, y por lo tanto se enviaría antes de los encabezados y provocaría una advertencia .

les animo a utilizar headers_sent() para comprobar si los encabezados se ha enviado antes de usar headers() después echo, así:

<?php 
echo "Foobar\n"; 
if(!headers_sent()) 
    header('Location: /helloworld.php'); 
?> 

Enlaces relacionados:

+0

Gracias por la ayuda lo aprecio :) –

Cuestiones relacionadas