Horst Nogajski: Win2k, Kommandozeilen-Scripte und kontinuierliche Echo-Ausgabe

Hallo zusammen,

ich würde gerne einige PHP-Scripte per Kommandozeile auf meinem Rechner laufen lassen und eine kontinuierliche Informationsausgabe erhalten.

Die Scripte laufen und erfüllen Ihre Aufgaben, aber ich bekomme immer nur blockweise Informationen ausgegeben.
So wie es scheint werden die Ausgabenm erst gepuffert und dann zusammen ausgegeben, aber nicht nur erst am Ende eines Scriptes sondern sehr wahrscheinlich immer wenn der/ein Puffer? voll ist.

Auf dem Rechner läuft Windows 2000 und PHP 4.3.4.
Die Scripte werden mit diesem Befehl aufgerufen:
php.exe -q -c C:\Pfadzur\lokalenphpini\ -f script_dateiname.php

Ich vermute das das weniger mit PHP als vielmehr mit Windos oder der Windowskonsole zu tun hat.

Irgendwelche Ideen?

Viele Grüße,
Horst

  1. So wie es scheint werden die Ausgabenm erst gepuffert und dann zusammen ausgegeben, aber nicht nur erst am Ende eines Scriptes sondern sehr wahrscheinlich immer wenn der/ein Puffer? voll ist.

    genau dem nagel auf den kopf getroffen

    Ich vermute das das weniger mit PHP als vielmehr mit Windos oder der Windowskonsole zu tun hat.

    falsch, es ist PHP sache, du musst das STDOUT handle hot machen (also ungebuffert)

    1. Hallo,

      genau dem nagel auf den kopf getroffen

      Danke, *g*

      falsch, es ist PHP sache, du musst das STDOUT handle hot machen (also ungebuffert)

      weitergehende Hinweise sind willkommen.

      Gruß,
      Horst

      1. Moin,

        weitergehende Hinweise sind willkommen.

        Na wenn Du hier http://www.php-homepage.de/manual/features.commandline.php nichts findest ;-)

        Stefan

        1. Hallo,

          Na wenn Du hier http://www.php-homepage.de/manual/features.commandline.php nichts findest ;-)

          Was bitte schön soll das sein?

          [ ] A) Ein Beweis dafür das _Du_ das Posting nicht richtig gelesen hast?

          [ ] B) Ein Witz dessen tieferen Sinn ich nicht erfassen konnte?

          [ ] C) Sonstiges?

          Mein Vermerk 'weitergehende Hinweise sind willkommen' bezieht sich ja wohl ausdrücklich auf: 'du musst das STDOUT handle hot machen (also ungebuffert)'.

          Deshalb verstehe ich nicht was dieser so unmotiviert dahingeschluderte Link aufs PHP-Manual soll?

          Falls Du die Seite zu den Kommandozeilen-Scripten schon mal gelesen hast kannst Du mir ja sicherlich zeigen wo denn dort steht wie man einen kontinuierlichen (ungepufferten) Output erzeugt?

          Gruß,
          Horst

          PS: Ich bekomme weder mit der Verwendung der .../cli/php.exe noch mit Verwendung der normalen php.exe und entsprechenden Parametern in der php.ini das erwünschte Resultat. (implicit_flush, etc)

          1. Hallo Horst,

            Na wenn Du hier http://www.php-homepage.de/manual/features.commandline.php nichts findest ;-)
            Was bitte schön soll das sein?
            [ ] A) Ein Beweis dafür das _Du_ das Posting nicht richtig gelesen hast?
            [ ] B) Ein Witz dessen tieferen Sinn ich nicht erfassen konnte?
            [ ] C) Sonstiges?

            [x] C) Sonstiges?

            Mein Vermerk 'weitergehende Hinweise sind willkommen' bezieht sich ja wohl ausdrücklich auf: 'du musst das STDOUT handle hot machen (also ungebuffert)'.
            Deshalb verstehe ich nicht was dieser so unmotiviert dahingeschluderte Link aufs PHP-Manual soll?

            Hast Du die Seite durchgelesen, auf die sorgfältig verwiesen wird? Es handelt sich um einen korrekten Link :)

            Ich habe es für Dich getan, und habe den zweiten Eintrag von Tabelle 23-1 gefunden, der in sich schon interessant für Dich ist und darüber hinaus weitere interessante Links enthält, denen Du offensichtlich nicht gefolgt bist.

            Freundliche Grüsse,

            Vinzenz

            1. Hallo Vinzenz,

              [x] C) Sonstiges?

              Na, wird wohl so sein.

              Hast Du die Seite durchgelesen, auf die sorgfältig verwiesen wird?

              Na logo.

              Ich habe es für Dich getan, und habe den zweiten Eintrag von Tabelle 23-1 gefunden, der in sich schon interessant für Dich ist und darüber hinaus weitere interessante Links enthält, denen Du offensichtlich nicht gefolgt bist.

              Das sagst Du jetzt so.

              Ich hatte es im vorigen Posting, (auf das Du dich ja beziehst), auch schon geschrieben: implicit_flush() (= der 2. Eintrag in Tabelle 23.1, den Du freundlicherweise für mich gelesen hast) steht bei mir in der php.ini auf on, oder es ist sowieso standardmäßig immer auf on mit der Verwendung der cli/php.exe.
              Trotzdem wird der Output im Konsolenfenster immer gepuffert, auch wenn ich im Script die Funktion flush() verwende wird es gepuffert. Das hatte ich wohl auch schon gesagt im Ausgangsposting.

              Ich habe manchmal den Eindruck das (auch manchmal) Antworten mehr mit dem Ziel, den Oberlehrer zu spielen, gegeben werden als der Absicht einem Fragesteller zu helfen. Und wenn dann noch nicht mal die Postings auf die geantwortet wird richtig gelesen wurden dann sind solche Antworten in meinen Augen 100% unnütz.

              Viele Grüße,
              Horst

              1. Hallo Horst,

                das Verhalten Deiner Anwendung kann ich nicht nachvollziehen,
                allerdings ist meine Umgebung neuer als Deine:

                PHP 4.3.5 unter Windows XP
                Die Ausgabe erfolgt hier genau wie im Handbuch beschrieben.
                Sogar mit der meinem PHP unbekannten Option -q, sogar mit
                dem laut Handbuch überflüssigen -f.

                Mein einfaches Skript sieht so aus:

                <?php
                   $i = 0;
                   while($i < 20) {
                     echo "$i\n";
                     flush();        // ist bei meiner Konfiguration überflüssig
                     sleep(1);       // damit die Ausgabe auch schön sehe
                     $i++;
                   }
                ?>

                Hier weiss natürlich keiner, wie Dein Skript aussieht,
                welche Ausgabe in welcher Art und Weise erfolgt
                (außer blockweise) und wie Du sie erwartest.

                Freundliche Grüsse,

                Vinzenz

                1. Hallo Vinzenz,

                  mittlerweile habe ich den Fehler gefunden:
                  Ich hatte aus der PHP_4.3.4-Distribution die php.ini_recommended
                  genommen und entsprechend für die Kommandozeile angepasst, weil ich u.a. auch alle als 'deprecated' ausgezeichneten Direktiven wie z.B. 'allow_call_time_pass_reference' usw. aus meinen Scripten ausmerzen wollte.

                  Leider, leider stand dort im Gegensatz zur php.ini_dist die Directive output_buffering = 4096 anstatt = 'off'.

                  (und das habe ich übersehen, Seufz, ...)

                  Die Ausgabe erfolgt hier genau wie im Handbuch beschrieben.
                  Sogar mit der meinem PHP unbekannten Option -q, sogar mit
                  dem laut Handbuch überflüssigen -f.

                  Hier weiss natürlich keiner, wie Dein Skript aussieht,
                  welche Ausgabe in welcher Art und Weise erfolgt
                  (außer blockweise) und wie Du sie erwartest.

                  Es war definitiv klar das der Fehler nicht in den Scripten liegen kann, schlieslich war auch das flush() in den Scripten nicht erfolgreich, usw.

                  Aber Deine Bemerkung mit den zusätzlichen Startoptionen usw. hat mich dazu veranlasst die cli/php.exe auch mal _nur_ mit einem Script ohne Parameter (und ohne php.ini) aufzurufen, (was erst ging nachdem ich die php.ini für den lokalen Webserver auch aus dem Systempfad gelegt hatte).
                  Das war dann aber sozusagen der Durchbruch in der Fehlereingrenzung, ;-)

                  Vielen Dank und viele Grüße,
                  Horst

                  PS: Jetzt machen sie schöne, kontinuierliche Ausgaben, =:)
                  wie z.B.:

                  running: E:\TEMP\xcopy_merge_binlocals.phpl ...

                  • Get Dirinfo from biko

                  • Get Dirinfo from eminenz
                      [eminenz] serverfile is older: run_phpl.cmd
                      [eminenz] serverfile is older: php.ini
                      [eminenz] serverfile is older: hn_deepdir.class.php
                      [eminenz] serverfile is older: xcopy_merge_binlocals.phpl

                  • Get Dirinfo from biko

                  • Get Dirinfo from mobilist
                      [mobilist] clientfile is older: run_phpl.cmd
                      [mobilist] clientfile is older: php.ini
                      [mobilist] clientfile is older: hn_deepdir.class.php
                      [mobilist] clientfile is older: xcopy_merge_binlocals.phpl

                  • Get Dirinfo from biko

                  • Get Dirinfo from musicman
                      [musicman] no Clientfile: exifcopy.exe
                      [musicman] no Clientfile: exifdate.exe
                      [musicman] no Clientfile: exifedit.exe
                      [musicman] no Clientfile: exiffile.exe
                      [musicman] no Clientfile: exifkey.exe
                      [musicman] no Clientfile: exiflist.exe
                      [musicman] clientfile is older: run_phpl.cmd
                      [musicman] serverfile is older: w5sp_status.log
                      [musicman] clientfile is older: php.ini
                      [musicman] clientfile is older: hn_deepdir.class.php
                      [musicman] clientfile is older: xcopy_merge_binlocals.phpl

                  • Final
                      [eminenz] clientfile is older: w5sp_status.log

                  • READY
                      There are 904 files in C:\bin_local
                      Action tooks 58,705 sec

                  • CopyList:
                      run_phpl.cmd                     :   EMINENZ     >    BIKO
                      php.ini                          :   EMINENZ     >    BIKO
                      hn_deepdir.class.php             :   EMINENZ     >    BIKO
                      xcopy_merge_binlocals.phpl       :   EMINENZ     >    BIKO
                      run_phpl.cmd                     :   BIKO        >    MOBILIST
                      php.ini                          :   BIKO        >    MOBILIST
                      hn_deepdir.class.php             :   BIKO        >    MOBILIST
                      xcopy_merge_binlocals.phpl       :   BIKO        >    MOBILIST
                      exifcopy.exe                     :   BIKO        >    MUSICMAN
                      exifdate.exe                     :   BIKO        >    MUSICMAN
                      exifedit.exe                     :   BIKO        >    MUSICMAN
                      exiffile.exe                     :   BIKO        >    MUSICMAN
                      exifkey.exe                      :   BIKO        >    MUSICMAN
                      exiflist.exe                     :   BIKO        >    MUSICMAN
                      run_phpl.cmd                     :   BIKO        >    MUSICMAN
                      w5sp_status.log                  :   MUSICMAN    >    BIKO
                      php.ini                          :   BIKO        >    MUSICMAN
                      hn_deepdir.class.php             :   BIKO        >    MUSICMAN
                      xcopy_merge_binlocals.phpl       :   BIKO        >    MUSICMAN
                      w5sp_status.log                  :   BIKO        >    EMINENZ
                      w5sp_status.log                  :   BIKO        >    MOBILIST