• Process und Co.

    von am 4. Mai 2010

    Gestern hatte ich ja bereits kurz angesprochen, dass es aus Frankreich was neues gibt. Die Komponenten von Fabien Potencier haben gestern Abend also den Weg auf meinen Computer gefunden und wollten natürlich gleich ausprobiert werden. Tja dumm gelaufen, leider habe ich die Process-Klassen nicht zum Laufen bekommen.

    Im ersten Schritt hat er meine PHP.exe nicht gefunden. Ja richtig ich arbeite mit Windows. Schade eigentlich, naja da habe ich ‘nen Weg drumrum gefunden. Ich habe den Pfad einfach hard reinkodiert, kann man ja mal machen, wenn man was testen will. Soweit hat es dann auch funktioniert.

    Dann lief auch alles durch. Nur leider ohne Effekt. Mein Code, der eigentlich klappen sollte, sah so aus:

    <?php
    
    include_once 'Process.php';
    include_once 'PhpProcess.php';
    
    use Symfony\Components\Process\PhpProcess;
    
    $process = new PhpProcess('C:\Users\phm\websites\phphatesme\test\script.php');
    $process->run();
    
    echo $process->getOutput();
    

    Leider bekomme ich als Output nur den Namen des Skripts, dass ich angegeben habe. Tja jetzt stehe ich hier und habe keinen richtigen Artikel. Ich kann aber ein wenig darüber erzählen, was ich eigentlich machen wollte. Im Prinzip ganz einfach. Das Skrtipt skript.php sollte nicht mehr machen, als “hallo welt” ausgeben. Und damit wollte auch mein aufrufendes Skript einfach nur “hallo welt” ausgeben.

    Als nächstes hätte ich dann probiert, ob die getOutput Methode nur den endgültigen output des Prozess ausgibt oder auch schon was von der Methode zurückgegeben wird wenn das Skript zwischendurch mal mit flush seine Ausgabe schon mal auf die Kommandozeile pummt. Wäre auf jeden Fall ein cooles Feature, mit dem man bestimmt einiges machen könnte. Vielleicht auch irgendwas streamartiges. Viel Platz für Spielereien. Naja leider ist es dann gar nicht so weit gekommen und eine Doku gibt es auch noch nicht. Wir müssen also unser kleines Prozess-Abenteuer ein wenig verschieben. Falls einer von euch schon weiter gekommen ist, dann hoffe ich mal, dass ihr hier ein wenig Licht ins Dunkel bringt.

    Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    16 Kommentare »


    • Arne Riemann
      am 4. Mai 2010 um 07:18 Uhr

      Das Thema klingt wirklich interessant, würde mich freuen wenn du dort weiter dran bleibst.


    • red
      am 4. Mai 2010 um 08:41 Uhr

      Hi
      versuchs mal mit:

      $process = new PhpProcess(file_get_contents(‘C:\Users\phm\websites\phphatesme\test\script.php’));

      das kleine ‘as a string’ ist nicht ganz unwichtig… ;-)


    • Martin Kuckert
      am 4. Mai 2010 um 08:42 Uhr

      Ich bin ein wenig enttäuscht, dass der Prozess nicht parallel angestoßen wird, sondern die run-Methode die komplette Verarbeitung kapselt. So ist der Mehrwert eher überschaulich.


    • Stephan Hochdoerfer
      am 4. Mai 2010 um 09:03 Uhr

      Ich habe in der Vergangenheit schon mehrfach versucht PHP Prozesse im Hintergrund zu starten um Jobs auszulagern. Das gab immer irgendwie unschöne Seiteneffekte. Mittlerweile würde ich eher zu Tools wie dropr, Gearman, … raten. Die Installation ist meist recht simpel und die Verwendung i.a.R. auch nicht wirklich kompliziert.


    • red
      am 4. Mai 2010 um 09:29 Uhr

      @Martin: Hätte auch eine asynchrone Verarbeitung erwartet… So macht das ganze doch nur ziemlich begrenzt Sinn.
      @Stephan: Sag’ das mal dem Hoster des Kunden…


    • darookee
      am 4. Mai 2010 um 09:41 Uhr

      Würde mich mal interessieren, ob das nicht an Windows liegt. Die Komponenten im Zend_Framework laufen ja auch nur unter Unix :-/


    • Adrian
      am 4. Mai 2010 um 09:53 Uhr

      Habe mir die Process.php nicht angeschaut aber die PHP proc*-Funktionen laufen nur auf posix-Systemen. Soweit mein letzter stand.


    • Nils Langner
      am 4. Mai 2010 um 10:06 Uhr

      @Adrian: Das mit Windows habe ich mir schon gedacht, leider findet man in der Doku nirgends diese Einschränkung. Ich versuchs mal auf nem Linux System, vielleicht klappt es da. Oder erstmal mit den Tipps von red.


    • Martin Kuckert
      am 4. Mai 2010 um 10:13 Uhr

      @Adrian: Nein, die proc*-Funktionen sind Plattformunabhängig. Du meinst die pcntl*-Funktionen, die sind Posix-Only.


    • Adrian
      am 4. Mai 2010 um 10:29 Uhr

      @Martin du hast Recht ;-)


    • Sven
      am 4. Mai 2010 um 10:33 Uhr

      Zum Thema Linux kann ich nur den VMWare Player empfehlen. Der ist komplett kostenlos und man kann damit nun sogar VMWares erzeugen. Dann schnell ein Ubuntu installiert und ab gehts. =)


    • Jens
      am 4. Mai 2010 um 12:18 Uhr

      @Sven ja, der ist echt nicht übel, habe früher auch viel mit der VirtualBox (sun) gearbeitet, ebenfalls kostenlos.


    • Juan M.
      am 4. Mai 2010 um 13:44 Uhr

      Also ich denke hier fehlt auch etwas “Know How”.
      Ein Prozess ist ein Programm das man ein mal startet und irgendwann endet.
      Ein Service ist ein Dienst der Permanent das gleiche tut.
      Im Gegensatz zum Prozess kann der Service einfach angehalten werden, jederzeit. Das muss allerdings auch schon natürlich so programmiert werden.

      Ich habe schon mehrere Dienste in PHP programmiert die teilweise Monate laufen, allerdings nur unter Linux ;)
      Btw. haben sowohl Dienste, als auch Prozesse eigentlich nur ein Log und keine Ausgabe, denn beide laufen im Hintergrund.


    • KingCrunch
      am 4. Mai 2010 um 16:39 Uhr

      Auch nicht ganz richtig: Prozesse, wie auch Dienste, können (und viele: müssen) auch eine Ausgabe besitzen. Oft existiert dazu bloss keine aktive Konsole, die das anzeigen könnte ;) (–> stdout/sterr gehn ins Leere), oder die Ausgabe wird umgeleitet. Alles andere würde bedeuten, dass man keine Programme entwickeln könnte, die man über Pipes verknüpft.

      Nebenbei können alle Prozesse auch jederzeit angehalten werden (Interrupts), oder man kickt einfach den Parent-Prozess. Sowieso sind Diense (“Services”, “Daemons”) auch nur Prozesse, bloss das diese darauf ausgelegt sind, das sie immer ohne Terminal laufen und sich nicht selbstständig beenden. “Immer das Gleiche” ist ebenso relativ. In den meisten Fällen warten sie auf Anfragen von anderen Prozessen (auch über Netzwerk, wie zB bei einem HTTP-Daemon) und reagieren darauf entsprechend.

      Prozesse sind die kleinste Einheit ausführbaren Codes des Betriebssystems. Ein Daemon ist eine spezielle Art von Prozess.


    • Juan M.
      am 5. Mai 2010 um 20:49 Uhr

      @KingCrunch: Besser hätte ich es nicht erklären können ;)
      Das mit den Triggern wollte ich fast auch schon mit rein schreiben, aber ich denke wiki’s gibs ja genug :)


    • Stephan Hochdoerfer
      am 6. Mai 2010 um 18:25 Uhr

      Das Thema scheint wohl gerade aktuell zu sein :)

      http://kore-nordmann.de/blog/0098_native_job_queue.html

    RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

    Hinterlasse einen Kommentar

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.