2010-08-26 11 views
7

Bei der Migration auf meinen neuen Server ist etwas seltsames passiert.Echo vor Kopfzeile möglich()

Ich habe ein Skript, das Benutzer zu einer anderen Webseite unter bestimmten Bedingungen umleiten wird. Was ich tat, ist jedoch "Redirecting ...", und dann die header() -Funktion, um tatsächlich umzuleiten. Hier ist, wie der Code aussah:

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

Jetzt habe ich nur bemerkt, dass dies falsch ist nach unserem neuen Server umgeschaltet, getestet es aus und sah, dass es nicht nur Ausgabe Umleiten umleiten würde ... und wenn ich Nach der Suche haben Sie gelernt, dass Sie vor der Verwendung der Funktion header() keine Ausgabe (außer ob_start usw.) haben dürfen.

Frage ist, warum ist dieser Code, der in keiner PHP-Installation funktionieren sollte, auf meinem alten Server arbeiten? Es wird mit dem Echo vor header() umgeleitet, kein Problem.

Danke!

+1

Ich glaube, Sie auf die Ausgabe-Pufferung standardmäßig in der php.ini drehen kann. Der Nachteil ist, dass die gesamte Anforderung abgeschlossen sein muss, bevor eine Ausgabe an den Benutzer gesendet wird. – meagar

Antwort

9

Möglicherweise haben Sie auf dem alten Server Ausgabepuffer aktiviert: Die Ausgabepufferung gibt nichts aus, bis das Skript ausgeführt wird. Dadurch kann der Header vor der eigentlichen Ausgabe ausgegeben werden (da er weiß, dass die Header zuerst gesendet werden sollen).

Wenn das Sinn macht.

+0

Danke! das scheint das Problem zu sein, nur php.ini auf alten Server überprüft und output_buffering ist auf 4096 gesetzt, so war es auf :) –

1

Es funktionierte auf Ihrem alten Server, da Sie die Pufferung der Ausgabe standardmäßig aktiviert hatten, die von der php.ini eingestellt wurde.

+0

Danke! Ich schätze es! –

4

Vielleicht wurde Ihre alte Installation output_buffering in der php.ini als wahr definiert. Dies verzögerte die Ausgabe, so dass Sie die Header auch nach dem Echo einstellen können.

+0

Danke! Ich schätze es! –

3

Sie müssen die Pufferung eingeschaltet haben, obwohl Sie dies nicht selbst getan haben. output_buffering = On in php.ini?

+0

Danke! Ich schätze es! –

0

Der alte Server hat wahrscheinlich die Ausgabepufferung standardmäßig aktiviert. Dies bedeutete, dass es nicht sofort echo, sondern warten würde, bis das ganze Skript beendet ist, und dann echo. Dies bedeutet auch, dass die Kopfzeile vor der echo (seit der Pufferung) gesendet wurde und daher nicht zu einer Warnung führen würde.

Auf dem neuen Server haben Sie höchstwahrscheinlich nicht Ausgang Pufferung standardmäßig aktiviert, und dies würde bedeuten, dass echo sofort, ohne Pufferung, und daher würde es vor den Überschriften gesendet werden und zu einer Warnung führen .

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

Weiterführende Links:

Ich möchte Sie ermutigen headers_sent() zu verwenden, wenn die Header zu prüfen, vor der Verwendung des headers() nach echo, wie dies geschickt worden

+0

Danke für die Hilfe Ich schätze es :) –