Ankündigung

Einklappen
Keine Ankündigung bisher.

CLI, Command line Eingabe während der Laufzeit

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • CLI, Command line Eingabe während der Laufzeit

    Hi,

    Hab mal ne Frage zu PHP und CLI:

    Wenn ich ein Script laufen lasse, kann an einer Stelle eine Eingabe einfordern
    PHP-Code:
    echo "Gib was ein: ";
    if(
    $stdin fopen("php://stdin","r")) {
        
    $input trim(fgets($stdin));
        
    fclose($stdin);
    }

    echo 
    "\n".'Du hast'.$input.'eingegeben'."\n"
    Gibt es in PHP eine Möglichkeit, dass er (zB eine schleife) immer weiter macht aber auf die Eingabe des Benutzers reagieren kann.
    Wenn ich also ENTER drücke er den Inhalt in die Variable $input schmeißt, weiter nix. Wenn der das nächste mal $input abprüft soll er dann einfach nur den neuen, eingegebenen Wert haben.

    Ich weiß, PHP ist eigendlich als zustandsloses Dingens gedacht.
    Mich interessiert aber, ob es die Möglichkeit gibt.

    Gruß
    Der Desian
    Wenn dich was ankotzt, machs besser.


  • #2
    Pack das einfach in eine Schleife. Die Eingaben landen auf dem Stapel...
    PHP-Code:
    #!/usr/bin/php
    <?php
    $sPrompt 
    ": ";
    if(!
    $rStdin fopen("php://stdin","r")) die();

    $bExit false;

    do {
        echo 
    $sPrompt;
        
    $sInput trim(fgets($rStdin));
        if (
    $sInput == 'exit'$bExit true;
        
    doSomething($sInput);
        } while (!
    $bExit);
    fclose($rStdin);


    function 
    doSomething($sInput) {

        echo 
    "Du hast '$sInput' eingegeben\n";
        
    //sleep (3);
        
    return;
    }
    ?>

    Kommentar


    • #3
      Hi,

      dann steht das Script aber an der Eingabe.
      Das soll es ja grad nicht.
      Was sich suche ist quasi so ne Art ThreadMode für PHP.

      Beispiel:
      Ich parse gerade ein 240MB-File nach bestimmten kriterien in die DB.
      Zwischendurch wird interesant, wie weit er ist, wieviel er in die DB geschrieben hat, was er ausgelassen hat, etc.
      Nun möchte ich eine Taste (oder auch Taste+Enter) bestimmen, bei dem mir die Werte ausgegeben werden.
      Unabhängig von dieser Eingabe soll er weiter das File in die DB parsen.

      Ich bin mir einfach nicht ganz sicher ob das unmöglich ist.
      Vieleicht gibt es unter PHP auch eine ProzessControling-Möglichkeit.

      Gruß
      Der Desian
      Wenn dich was ankotzt, machs besser.

      Kommentar


      • #4
        Evtl. hilft Dir das weiter

        http://pear.php.net/manual/de/packag...dispatcher.php

        Kommentar


        • #5
          Achso. In dem Fall hilft nur ein zweites Skript, dass entweder direkt
          selbst auf Daten vom Hauptprozess zugreift (Dateien/Datenbank/Shared
          Memory) oder diesem über diesen Weg Nachrichten zuschiebt, die sich
          dieser dann eben dauernd anschauen muss und dann darauf reagieren
          kann (und seinerseits dem Beobachter-Prozess ein Päckchen auswirft).

          Für Ersteres könnte es z.B. sinnig sein, ein Status-Objekt in eine Session
          zu werfen, auf das das Beobachter-Skript zugreift. Für letzteres könnten
          Ticks[1] vielleicht hilfreich sein. Bleibt natürlich die Frage, wie weit du den
          eigentlichen Prozess verlangsamen möchtest, blos um informiert zu sein,
          wie lange er noch anhält.

          [1] http://php.net/manual/en/control-str....declare.ticks

          Basti

          PS @Agundur:
          Diese Umsetzung eines Dispatchers ändert ja nichts daran, dass PHP
          keine Multithread-Eigenschaften besitzt.

          Kommentar


          • #6
            K, da sind 2 gute Ansätze.
            Ich werde beiden nachgehen.
            Ich denke, das trifft es, wenn nicht meld ich mich nochmal.

            Danke!

            Gruß
            Der Desian
            Wenn dich was ankotzt, machs besser.

            Kommentar


            • #7
              Oh, das mt der Session geht wohl nicht. Anscheinend wird diese zwischen session_start() und dem
              Ende des Skriptes für andere Prozesse gelocked. Da müsstest du dir wohl einen eigenen Session
              Handler schreiben.

              Basti

              Kommentar

              Lädt...
              X