echo-Anzeigen dann header('Location') ob_start() Problem

dwex

Erfahrenes Mitglied
Hallo Leute,

konnte meinen Titel leider nicht besser wählen.

Also was mache ich.
Ich habe ein Newsletterscript geschrieben welches über SMTP Mails jeweils einzeln an die Empfänger senden (persönliche Anrede im Newsletter).

Dazu sende ich, damit ich vom Server keinen Timeout bekomme, immer noch "Blöcke" mit z.Zt. 500 Mails gleichzeitig und rufe dann das Script mit einem Zeiger neu auf. Das funktioniert bestens.
Jetzt wollte ich einfach bei jedem Scriptdurchlauf auch einen Fortschritt angeben - dazu habe ich mal das Beispiel (ziemlich weit unten) von dieser Seite genommen und daraus folgendes Testscript gemacht:
PHP:
<?php
ob_start();
echo "Fortschritt: ".$_GET['fortschritt']."%";

sleep(5); // Pause zum simulieren von größeren Operationen

if($_GET['fortschritt'] != 100) {
$fort = $_GET['fortschritt']+10;
header('Location:  http://192.168.222.9/fortschritt.php?fortschritt='.$fort);
}



ob_end_flush();

?>
Jetzt würde ich ja erwarten, dass er alle 5 Sekunden einen neuen Fortschritt ausgibt - selbiges tut er aber nicht. Er ruft zwar die "Schleife" auf und sendet jeweils den neuen Header - eine Ausgabe erhalte ich aber erst nach dem letzten Durchlauf - also wenn die IF-Abfrage falsch (oder richtig - je nachdem wie man es sieht) wird.

Hat jemand von euch eine Idee und kann mir auf die Sprünge helfen - gerne auch mit einem völlig anderen Lösungsansatz.
 
Zuletzt bearbeitet:
Das liegt auch daran das dein header nach 0 sekunden standart wert sich sezt.
PHP:
header('Location:  http://192.168.222.9/fortschritt.php?fortschritt='.$fort , 5);
versuch es mal hiermit damit gibst du das delay an. Musst du aber experimentieren mit den werten das es zufriedenstellend ist.

Oder du gehst über die "refresh" function:
PHP:
header('Refresh: 5; URL=http://192.168.222.9/fortschritt.php?fortschritt='.$fort);

letzter Code ist ungetestet sollte aber genauso funktionieren.
 
Zuletzt bearbeitet:
Hallo,

vielen Dank für deine schnelle Antwort.

Also erstere Variante funktioniert nicht bei mir - ich bekomme wieder keine Ausgabe (ausser am Schluss 100%)

Die zweite Variante funktioniert (auch mit Refresh: 0) - hierzu jedoch noch eine Frage:
Ist das gleichzusetzen mit der Meat-Refresh-Variante?
Wenn ja - SelfHTML schreibt ja das man sich auf Meta-Refresh nicht verlassen darf, da es vom Benutzer ggf. deaktiviert werden kann bzw. das dies evtl. nicht alle Browser unterstützten?
 
Ja über die Header funktion bindest du meta tags ein. Allerdings nicht in HTML format sondern als HTTP rohform header.

Wie das ganze in der Praxis aussieht kann ich dir leider nicht sagen, da ich für solche ich nenne es jetzt mal "visuelle effekte" nicht php/html statisch auf animiert schummelein benutze sondern gleich auf Flash bzw Ajax zurückgreife.

Edit:
Ich glaube im ersten code ist ein syntax fehler:
PHP:
header('Location:  http://192.168.222.9/fortschritt.php?fortschritt='.$fort.' , 5');

versuch es am besten nochmal mit diesem Code, und poste das Ergebniss bitte würde mich interessieren =)
 
Zuletzt bearbeitet:
@NoUse4aNick: bist du dir sicher das du nicht das meta tag meinst
Hab jedenfalls noch nie von der Möglichkeit eines delays in der header funktion gehört. Zumal das auch nichts hilft.
Und selbst wenn es geht dann wird PHP Serverseitig ausgeführt. das heisst er wartet auch Serverseitig 5 Sekunden.

@dwex: Mit ob_start wartest du ausserdem bis zum Ende des Scripts bis er den Buffer ausgibt.
PHP wird Serverseitig ausgeführt und dann an den Clienten geschickt und zwar immer erst am Ende des Skripts.
Das was du umsetzen willst erfordert Ajax.
 
@ DaChris: Das ist was ich per Google gefunden habe. Ich benutze wie schon oben beschrieben solche Funktionen zum Animations Schummeln mit PHP nicht.
 
@ DaChris: Das ist was ich per Google gefunden habe. Ich benutze wie schon oben beschrieben solche Funktionen zum Animations Schummeln mit PHP nicht.
Mh ich weis nicht was du da gefunden hast aber wie gesagt ist es technisch schon garnicht möglich da PHP Serverseitig ausgeführt wird und dann der Content an den Client weitergeleitet wird.
Beide Inhalte die du gezeigt hast funktionieren höchstens in einem html metatag so wie du es beschreibst ist es nicht möglich das Problem zu lösen.
 
Selbst wenn du eine Seite über googel gefunden hast die sagt es geht heisst es nicht das es gehen muss.
Es geht einfach nicht weil die Technik es nicht zulässt.
In meinem Beitrag habe ich hoffentlich doch verständlich und genau erklärt warum es nicht gehen kann....
Vielleicht hilft ein Bild weiter?
PHP_Funtionsweise.gif
 
Zurück