Terminal Ausgabe in PHP-Script anzeigen lassen

  • Einen schönen guten Abend wünsche ich,


    ich verfolge dieses Forum schon einige Zeit und bin sehr begeistert. Nun bin ich jedoch mit meinem Latein am Ende und weiß vor allem nicht ob das was ich vorhabe überhaupt möglich ist. :)
    Auf meinem RASPI läuft Apache5 und ich habe erfolgreich eine Webseite erstellt um darüber einige GPIOs zu steuern. Nun interessiert mich der A/D Wandler mpc3008 sehr stark. Ich habe seine Ansteuerung etc. auch schon fertig und das python script gibt mir im Terminal nach dem Programmstart auch entsprechende Werte im Sekundentakt aus.
    Nun meine Frage an euch Experten:
    Kann ich das Pythonprogramm in PHP starten, UND die folgende Ausgabe von der Kommandozeile auf meiner Webseite anzeigen lassen?


    Wie gesagt ich hab keine Ahnung ob sowas überhaupt funktionieren kann aber ich hoffe dabei auf eure Kompetenz. :D


    Schonmal im Vorraus Vielen Dank


    Neolinga

    Der Pi rechnet mit allem, nur nicht mit seinem Benutzer.

  • > Kann ich das Pythonprogramm in PHP starten, UND die folgende Ausgabe von
    > der Kommandozeile auf meiner Webseite anzeigen lassen?
    Kann man machen. Hier im Forum gibt's zahlreiche Beispiele
    oder einfach googlen nach "php exec" und den ersten Eintrag
    anklicken.


    Haeufig geht es aber nicht so einfach, weil das Script vom User
    www-data ausgefuehrt wird der eingeschraenkte Rechte hat ...


    Ich wuerde eher zu AJAX raten. Das haette auch gleich den
    Vorteil dass man es dynamisch updaten kann. Dazu braucht
    es allerdings einige JavaScript-Kenntnisse.

  • ok erstmal dank,
    das mit dem exec (das aufrufen) ist kein problem, nur das auslesen, bzw die Anzeige der Terminalausgabe krieg ich nicht gebacken.
    Ich hoffe ich rede hier keinen Unsinn.


    LG

    Der Pi rechnet mit allem, nur nicht mit seinem Benutzer.

  • Es wird Zeit die angegebene Seite zu LESEN !


    Dort steht naemlich:


    > exec() führt ein gegebenen Befehl aus, ohne eine Ausgabe zu erzeugen. Die
    > Funktion gibt lediglich die letzte Zeile aus dem Befehlsergebnis zurück.

  • Das habe ich mir schon durchgelesen gehabt nur habe ich die Befehlssyntax nicht verstanden.


    PHP
    string exec ( string $befehl [, array &$ausgabe [, int &$return_var ]] )[/php]
    Wie muss der Befehl aussehen wenn ich z.B. mein Programm mit
    [code]python mcp3008.py

    aufrufen möchte und dies in einer Variable [code=php]$var[/php] abspeichern will?.


    Das array brauch ich denke ich nicht und die return_var auch nicht.


    Seid bitte etwas nachsichtig mit mir, bestimmt schlagt ihr euch die Hände gegen den Kopf und lacht über solche Fragen aber ich habe echt schon recht lange gesucht. (vielleicht nicht das richtige oder ich war einfach blind :s)


    LG

    Der Pi rechnet mit allem, nur nicht mit seinem Benutzer.

  • was ist an der Systax nicht zuverstehen?


    $var=exec( "python mcp3008.py");


    Solltest halt nur schauen, dass Pfade und Berechtigungen stimmen. Außerdem würde ich im Python Skript mit Shebang arbeiten und es ausführbar machen.


    Nebenbei, wenn du schon die PHP Doku gefunden hast, dann stehen in der doch viele Beispiele, die du adaptieren kannst.

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

  • Guten Abend,
    ich habe mir jetzt einige Beispiele angeschaut und selbst noch etwas herumprobiert.


    Die Grundstruktur des php Dokuments sieht nun wie folgt aus:



    ergänzt. Auch der Pfad stimmt.


    Hat jemand eine Idee wo der Fehler liegt? Bestimmt ist er recht trivial, jedoch bin ich für jede Hilfe dankbar.

    Der Pi rechnet mit allem, nur nicht mit seinem Benutzer.

  • Bezüglich deiner letzten Frage:
    exec(); gibt keine Ausgabe des Befehls zurück.. Dazu müsstest du etwas anderes nutzen was ich hier im Anschluss erläutere



    ...ich hab diesen Thread leider erst jetzt gesehen... kann aber 2 Möglichkeiten bezüglich der Überschrift vorgeben da ich das auch schon selber verwendet habe:



    1)



    2)
    [code=php]
    $fontcolor="ffffff";
    $handle = popen("ls -la 2>&1", 'rb');
    while (!feof($handle)) {
    $line = stream_get_line($handle, 10000, "\n");
    if (empty($line)) { continue; }
    if (preg_match("/^error/i", $line)) { $fontcolor="FF0000"; }
    $line = str_replace(" ", " ", $line);
    echo ("<font face='Arial, Helvetica, sans-serif' size='2' color='".$fontcolor."'>".$line."</font><br/>\n");
    flush();
    }
    pclose($handle);
    [/php]


    Das ist die wie ich finde elegantere Lösung da es in Echtzeit ausgegeben wird, denn bei der 1. Möglichkeit wird erst der Befehl ausgeführt, die gesamte Ausgabe ins Array $output geschrieben und erst danach das Array ausgegeben...


    Wenn man an mehreren Stellen den popen(); Befehl nutzen möchte empfiehlt es sich eine function dafür anzulegen - das ist sinnvoller da man bei Änderung die selbe Sache nicht 10x ändern muss sondern nur ein mal und der Aufruf bleibt gleich.
    Meine Funktion sieht wie folgt aus:
    [code=php]
    function _exec($cmd) {
    $S="&nbsp;";
    $fontcolor="ffffff";
    $handle = popen("$cmd 2>&1", 'rb');
    while (!feof($handle)) {
    $line = stream_get_line($handle, 10000, "\n");
    if (empty($line)) { continue; }
    if (preg_match("/^error/i", $line)) { $fontcolor="FF0000"; }
    $line = str_replace(" ", $S, $line);
    echo ("<font face='Arial, Helvetica, sans-serif' size='2' color='".$fontcolor."'>".$line."</font><br/>\n");
    flush();
    }
    pclose($handle);
    return;
    }
    [/php]


    Der Aufruf sieht dann zum Beispiel wie folgt aus:[code=php]_exec("ls -la /");[/php]



    Ein mögliches Anwendungsbeispiel für meine Favorisierte 2. Möglichkeit findest du von mir auch hier: Filme über vlc streamen

  • Vielen Dank, das ist eine sehr sehr elegante Lösung :bravo2: und funktioniert wunderbar :)


    Ich hätte abschließend noch eine kleine Frage:


    1. Wie wäre der Lösungsansatz bei einem Programm das dauerhaft (im Sekundentakt) neue Werte ausgibt? (Dauermessung)


    LG

    Der Pi rechnet mit allem, nur nicht mit seinem Benutzer.

    Edited once, last by Neolinga ().

  • Wenn das Programm die ganze Zeit, also länger als zB 120 Sekunden, laufen soll dann würde ich die Ausgabe in eine temporäre Logdatei schreiben lassen und über PHP, zB via AJAX, das Logfile auslesen lassen..
    Problem bei PHP ist nämlich das ein Prozess das PHP-Script aufhalten würde solange es läuft und es nach einer gewissen Zeit beendet wird.. Die Zeit kann man zwar erhöhen, zB so:
    [code=php]ini_set("max_execution_time", "240");[/php] aber dennoch ist das i.d.R. nicht so schön bzw kommt halt drauf an was du machen möchtest ;)


    Es wär also besser wenn du kurz beschreibst was du überhaupt vor hast und was du als Dauermessung über PHP laufen lassen möchtest - ansonsten guck dir mein Anwensungsbeispiel (Filme über vlc streamen) an

  • Mit der Dauermessung meinte ich ein Programm das in einer

    Code
    while true:

    Schleife immer wieder die gemessenen Werte ausgibt (bei dem mcp3008 durch bit schieben). Aber das mit dem Log.txt ist eine gute Lösung ich werde es denke ich mal so in Angriff nehmen :)


    Vielen Dank für deine Hilfe


    LG

    Der Pi rechnet mit allem, nur nicht mit seinem Benutzer.