Meine Webseite hängt in PHP Schleife ?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich bin gerade dabei, eine Steuerung für meinen Pool zu basteln und habe problem bei der Ausführung eines Pythonskriptes.

    Sobald ich den Button "Musik An" betätige, wird das Skript ausgeführt, aber die Seite befindet sich dauerhaft im Ladezustand.

    D.h. sie nimmt keine anderen Befehle an, bis ich das Laden abbreche.

    Ich habe auch schon versucht, das Skript via "&" im Hintergrund laufen zu lassen, leider ohne Erfolg.

    Einen Vereinfachten Code habe ich noch angefügt.

    Ich hoffe mir kann jemand helfen.

    Gruß

    Martin

    P.S. Sorry für den Titel des Threads, mir ist nichts besseres eingefallen.

    Code

    <?php

    if (isset($_POST['man']))

    shell_exec('export SYNCHRONIZED_LIGHTS_HOME="/home/pi/lightshowpi";sudo python $SYNCHRONIZED_LIGHTS_HOME/py/synchronized_lights.py');

    if (isset($_POST['maus']))

    shell_exec("sudo pkill -f synchronized_lights.py");

    ?>


    <!DOCTYPE html>

    <html>

    <head>

    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Poolsteuerung</title>

    </head>

    <body>


    <form method="post">

    <button name="man">Musik An</button>

    <button name="maus">Musik Aus</button>


    </body>

    </html>


  • Hallo,

    `shell_exec` ist "blocking", d.h. wartet, bis der aufgerufene Befehle beendet ist. Wenn dein Python-Skript länger (oder endlos lange) läuft, dann blockiert dein PHP Skript. Zeig' doch mal dein Python-Skript.

    Warum setzt du den Server-Teil nicht auch in Python um? Das macht viele Sachen einfacher.

    Warum exportierst du die Variable des Pfads? Das hat doch keinen wirklichen Vorteil?

    Gruß, noisefloor

  • `shell_exec` ist "blocking", d.h. wartet, bis der aufgerufene Befehle beendet ist. Wenn dein Python-Skript länger (oder endlos lange) läuft, dann blockiert dein PHP Skript. Zeig' doch mal dein Python-Skript.

    Das Python-Skript ist nicht von mir. Lightshowpi ist ein Programm, welches mittels Tonsignalen LEDs ansteuert die an den PI angeschlossen sind.

    Das Skript würde also solange laufen, bis man es aus macht.

    Warum exportierst du die Variable des Pfads? Das hat doch keinen wirklichen Vorteil?

    Das ist die Syntax die ich gefunden habe, wenn ich das Skript direkt aufrufe, bekomm ich eine Fehlermeldung, dass die Variable nicht vergeben ist.

  • Naja, sudo python /home/pi/lightshowpi/py/synchronized_lights.py sollte reichen.

    Nein, da bekomm ich die Fehlermeldung "Need to setup SYNCHRONIZED_LIGHTS_HOME environment variable, see readme".

    Das Homeverzeichnis habe ich für das Skript auch schon erstellt, leider hat es nichts gebracht.

    Gibt es evtl eine Möglichkeit dem PHP Skript zu sagen, dass es nicht bis zur Beendigung des Python Skriptes warten soll?

  • Hallo,

    Zitat

    Gibt es evtl eine Möglichkeit dem PHP Skript zu sagen, dass es nicht bis zur Beendigung des Python Skriptes warten soll?

    Plan B: den Server in Python umsetzen, das Skript mittels `subprocess` starten. Hätten den Vorteil, dass a) alles Python ist und b) der Prozess auch über Python beendet werden kann.

    Vielleicht gibt's auch eine äquivalente Möglichkeit in PHP...

    Danke für die Erklärung zum `export`. Ist zwar ein bisschen komisch, aber wenn das Skript das verlangt...

    Gruß, noisefloor

  • Versuche mal, dem phytonscript eine Ausgabe zu verpassen und dann beim exec unter PHP die Ausgebe in einen Stream umzuleiten (oder auch auf NULL), dass sollte aus meiner Sicht reichen, damit das PHP-Script nicht wartet, bis das Pythonscript fertig ist. PHP wartet bei exec auf eine Ausgabe.

    Das hat leider nicht funktioniert :(

    Hallo,

    Plan B: den Server in Python umsetzen, das Skript mittels `subprocess` starten. Hätten den Vorteil, dass a) alles Python ist und b) der Prozess auch über Python beendet werden kann.

    Vielleicht gibt's auch eine äquivalente Möglichkeit in PHP...

    Danke für die Erklärung zum `export`. Ist zwar ein bisschen komisch, aber wenn das Skript das verlangt...

    Gruß, noisefloor

    Mit der Umsetzung des Servers in Python gibt es mindestens 2 Probleme:

    1. Meine Kentnisse was Python angeht reichen gerade so für einfache Abfragen von GPIO.

    2. Der Server ist schon sogut wie fertig, dieses Problem ist sozusagen der letzte Schritt zum Erfolg für mich ;)

    Gruß

    Martin

  • Hallo,

    grundsätzlich ist die Lösung des Problem immer die gleiche: du musst das Python-Skript halt so aufrufen / ausführen, dass der Aufruf nicht-blockierend ist. Das ginge mit Python (und andere Programmiersprachen auch) über einen eigenen Prozess oder Thread.

    Ob und wie das mit PHP geht -> keine Ahnung. Aber eine Befragung von Google bringt dir da sicherlich Erleuchtung.

    Gruß, noisefloor

  • Hallo,

    grundsätzlich ist die Lösung des Problem immer die gleiche: du musst das Python-Skript halt so aufrufen / ausführen, dass der Aufruf nicht-blockierend ist. Das ginge mit Python (und andere Programmiersprachen auch) über einen eigenen Prozess oder Thread.

    Ob und wie das mit PHP geht -> keine Ahnung. Aber eine Befragung von Google bringt dir da sicherlich Erleuchtung.

    Gruß, noisefloor

    Vielen vielen Dank du hast mich auf die richtige Fährte gebracht. Der Trick ist hinter den Aufruf ein "> /dev/null &" zu setzen.

    Der vollständige Code sieht dann also so aus...

    Vielen Dank an alle dir mir geholfen haben :)

  • Der Trick ist hinter den Aufruf ein "> /dev/null &" zu setzen.

    Ok! Aber ein Trick ist das nicht, dachte du steckst etwas tiefer in der Materie denn:

    Ich zitiere mich mal selbst :angel:

    Versuche mal, dem phytonscript eine Ausgabe zu verpassen und dann beim exec unter PHP die Ausgebe in einen Stream umzuleiten (oder auch auf NULL),

    "> /dev/null &" ist der Ausgabe einen Stream auf NULL (also garnichts) zu verpassen.

    Also klassisch missverstanden :cool: aber Hauptsache es funktioniert.

    Als "alter PHP-Hase" rate ich dir bevor du weitermachst, mal ganz kurz zu schauen, ob du das nicht Objektorientiert machen möchtest. Es geht auch so wie du angefangen hast, aber wenn du die Logik von der Anzeige trennst, hast du es bedeutend einfacher, wenn du das mal weiterentwickeln willst.

    Normalerweise würde ich auch sagen mach alles mit PHP oder alles mit Python, das LightShow script ist aber geil und in dem Fall kann man ruhig die Benutzeroberfläche mit PHP machen und dann das Script aufrufen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!