PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : warum wird das script nicht der reihenfolge nach ausgeführt?



laminar
22-11-2002, 18:03
das nachfolgende script generiert leider den text output erst, wenn die wget funktion abgearbeitet ist. warum wird das nicht in der reihenfolge abgearbeitet?



$url = escapeshellcmd($url);
$user = escapeshellcmd($user);
$pass = escapeshellcmd($pass);


$safeurl = "ftp://".$user.":".$pass."@".$url;
echo "connected to: $safeurl<br><br>";
echo "$url will be transferred,<br><br>";
echo "your file will be transferred to xxx <br>
you will recieve a confirmation e-mail to the supplied adress: <b>$mail</b>";

shell_exec("wget -r -c --tries=0 --wait=60 --dot-style=mega --output-file=wget.log --server-response --directory-prefix=/xxx $safeurl");


$message = "transfer of: $url succeeded!";
/// $mail = "xxx@xyz.de";
$subject = "Filetransfer";
$xtra = "From: xxx@xyz.de\r\n";
$xtra .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";
$xtra .= "X-Mailer: PHP ". phpversion();

mail($mail,$subject,$message,$xtra);

Gaert
22-11-2002, 23:59
Hallo Laminar!

shell_execute unterbricht die Ausführung des Skripts, bis das aufgerufene Programm beendet ist.
Der Output wird erst an den Browser übermittelt, wenn das Skript abgearbeitet wird.
Wenn du vorher Output übertragen willst musst du flush(); aufrufen!

Das Skript läuft aber dann weiter bis zum Timeout (und belastet den Webserver solange mit einem unnötigen Prozess).
Und wenn der Timeout erreicht wird, dann schickt er auch keine Mail mehr!

Besser wäre es wget im Hintergrund auszuführen und zu beobachten wann der wget fertig ist!

Um wget im Hintergrund laufen zu lassen würde ich mir das hier mal runterladen...
http://www.naken.cc/mikehup.php

Ich würde den Code noch ein wenig verändern um die Prozess ID des aufgerufenen Programms zu loggen... dann könntest du mit nem bash skript (oder nem PHP skript is ja wurscht) regelmäßig per cron prüfen ob der entsprechende prozess beendet ist und die email verschicken!

laminar
23-11-2002, 11:34
es gibt demnach keine "reihenfolge" - denn mein "echo...." steht im script ja vor shell_exec.


deine idee ist gut -
klingt aber nicht ganz einfach; muss ich mir mal ansehen...
danke

Gaert
23-11-2002, 16:44
Hallo!

Doch, natürlich gibt es eine Reihenfolge!
Die Seite wird nur vom Webserver so lange gepuffert bis das Skript beendet ist und dann Komplett an den Browser übertragen!

Da ein Programmaufruf das Skript anhält bis der stdin stdout und stderr des aufgerufenen Programms geschlossen wird sieht man vom Skript output halt erst was, wenn das aufgerufene Programm beendet wurde!

flush() veranlasst den Server den Puffer schon vorzeitig an den Browser zu senden... das funktioniert aber nicht mit jedem Server und mit jeder Serverkonfiguration.