Problem mit Filepointer unter PHP

mmoeller

Grünschnabel
Hallo

Hab ein großes Problem:

Ich öffne per popen oder proc_open ein Programm und möchte jetzt die Ausgabe einlesen (per fgets). An sich funktioniert das auch, ABER :)

Es ist so, dass das Programm alle 2 Sekunden eine Zeile ausgibt und ich möchte am liebsten, dass ich die Zeile sofort sehe, aber funktioniert komischerweise nicht!

gekürzter Aufbau des Programms:
PHP:
$cmd="receivetest -t=usb -b=0x011c";
echo "Start\n";
$fp = popen($cmd,"r");
echo "Programm gestartet\n";
while (!feof($fp))
{
 echo "Schleifenanfang\n";
 $intext .= fgets($fp);
 echo "fgets\n";
 /* JETZT DIE VERARBEITUNG */
}

also eigentlich recht simple, wüsste nicht wo da n fehler sein soll.

Also, wenn ich jetzt das Programm starte:

php canreceive.php

dann kommt sofort:

Start
Programm gestartet
Schleifenanfang

dann 15 Sekunden warten....
Dann kommt plötzlich mehrfach hintereinander
fgets
Schleifenanfang
fgets
usw.

und dann wieder 15 Sekunden Stille...

Er wartet also immer 15 Sekunden, ließt dann alles der letzten 15 Sekunden ein und wartet dann wieder 15 Sekunden!

Hierbei ist es übrigens egal, ob das Programm alle 2 Sekunden oder alle 30 Sekunden die Zeile ausgibt! Es sind immer 15 Sekunden!

Hat jemand n Rat?

Miles
 
hmm, seltsam, hab gerade mal n anderes Programm gestartet und da gehts einwandfrei

Hab jetzt mal folgendes gemacht:

1. Das Programm per Hand gestartet => Ausgabe kommt sofort!
2. Das Programm per exec über PHP gestartet => Ausgabe kommt mit 15 Sekunden Verzögerung! dann wieder 15 Sekunden nichts, usw.

Sehr seltsame Sache :(

Miles
 
Hallo

hmm, wie verhält sich das, wenn ich ein Programm damit starte, dass ein Endlosschleife hat?
Das Programm gibt alle 2 Sekunden eine Zeile aus, solange bis ich es kille!

Miles
 
Das ist richtig...
Wenn Du z.B einen daemon starten willst kannst Du exec und den backtick operator nicht benutzen.

Das Problem mit der Ausgabe stellt sich aber auch (zumindest bei mir) wen man innerhalb des daemons print oder echo benutzt. Ich hab keinen Schimmer aber vielleicht kannste das mit ob_start(); und ob_end_flush(); lösen. Vielleicht wird dann rechtzeitig ausgegeben
 
Zurück