Dauerschleife über PHP unterbrechen.

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    ich finde einfach keine Lösung zu meinem Problem: Und zwar öffne ich über PHP ein Python-Script, welches eine Dauerschleife enthält. Allerdings möchte ich diese Schleife auch wieder über PHP beenden können. Dies klappt aber nicht, da während der Dauerschleife kein weiterer Befehl von PHP an meinen Raspi übergeben werden kann... Hier mein Quellcode:


    Der obere Teil ruft die Dauerschleife bewegung3.py auf. In dieser ist ein Interupt auf GPIO 22, womit ich die Schleife beenden kann. Ich muss nurnoch versuchen, den unteren Befehl während die obere Schleife noch läuft auf den Raspi schicken.

    Ich hoffe mir kann einer Helfen

    Gruß chico408

    • Offizieller Beitrag
    Zitat

    Meine Frage ist nun wie ich das machen soll?


    Hmmm, vergiss php oder python. Die Cross-Sprach-gehampel bringt nur Probleme.

    Zitat

    In dieser ist ein Interupt auf GPIO 22,

    ???? Da brauchst du doch dann kein php um die Schleife abzubrechen. Der Interupt springt doch immer an (wenn das Script läuft)

    Was steht denn in dem python Script drinne?

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Als Deamon ausführen oder die Ausgabe mit & ins Nirvana schicken, damit das PHP-scipt weiter läuft.


    Code
    exec('sudo python /home/pi/bewegung3.py > /dev/null &');

    probier auch mal

    Code
    system('sudo python /home/pi/bewegung3.py > /dev/null &');

    bin mir jetzt nicht sicher ob man bei exec umleiten kann.

  • Als Deamon ausführen oder die Ausgabe mit & ins Nirvana schicken

    Das " & " schickt es nicht ins Nirvana!
    Die Umleitung der Ausgaben ins Nirvana erfolgt durch " > /dev/null ". Das " & " schickt es in den Hintergrund.
    Also falsche Begriffe verwendet. Fatal für Anfänger die es somit falsch lernen

    bin mir jetzt nicht sicher ob man bei exec umleiten kann.

    Warum sollte man das nicht können? Das ist Teil des "Commands" welches ausgeführt wird und somit Teil der SHELL.

    system() ist aber nicht für alle Fälle sinnvoll. Zum einen gibt es die Ausgabe direkt zurück, weshalb man also die Ausgabe in eine Variable schreiben müsste um es nicht an der Stelle im PHP-Code direkt eine mögliche Ausgabe zu erhalten, und zum anderen gibt es nur die letzte Ausgabe-Zeile des ausgeführten Befehls zurück. Desweiteren kann man aber auch keinen möglichen Fehler erhalten, da es nur den Ausgabe-Kanal ( stdout ) verarbeitet aber nicht den Fehler-Kanal ( stderr ).

    Daher empfehle ich immer exec(); zu verwenden.
    Siehe dazu Forumsuche nach: sudo webscript
    1.Treffer, Beitrag#6


    Führt man einen Konsolen Befehl über PHP aus, wartet PHP eben so lange bis dieser Befehl beendet wurde. Das ist wie mit jedem anderen Befehl den man in der Konsole ausführt - führst du das Python Script manuell über die Konsole aus kommst du solange das Script läuft ja auch nicht zurück zum Promt sondern hängst quasi fest bis du STRG+C drückst (oder das Script allg. beendet wurde). Ist also quasi das selbe.

    Wenn du das Python Script also nun mithilfe von dem ans Ende des Commands eingefügten ' & ' in den Hintergrund schickst wird nicht auf dessen Beendung gewartet.

    Wenn du aber nun dieses Script auch wieder beenden willst musst du es speziell dazu bringen. Entweder indem man die PID ermittelt (Prozess ID, die absolut eindeutig ist) und das Script tötest, oder indem du ins Script einbaust das es auf ein sog. SIGNAL reagieren soll...

    Deiner Überschrift zu folge möchtest du ja die Dauerschleife unterbrechen. Demnach wäre das Thema hier noch nicht erledigt :fies:
    Ansonsten bitte die Überschrift im ersten Beitrag anpassen!

    Wenn dein Script aber irgendwas mit Interrupt zu tun hat (zB weil es für einen PIR is) kannst du das Script aber eigentlich auch unabhängig vom Webserver bereits vorher starten - siehe dazu Forumsuche nach: Autostart

  • Das " & " schickt es nicht ins Nirvana!
    Die Umleitung der Ausgaben ins Nirvana erfolgt durch " > /dev/null ". Das " & " schickt es in den Hintergrund.
    Also falsche Begriffe verwendet. Fatal für Anfänger die es somit falsch lernen

    Da sollte eigentlich wie im Schnipsel alles stehen, warum nur das & übrig geblieben ist weiß ich nicht. Letztlich freut es mich, dass es funktioniert hat, obwohl ich das anders lösen würde, aber so war die Frage ja nicht. Zudem kommt es darauf an, wie Nirvana definiert wird :angel:

  • Allgemein versteht man unter " ins Nirvana schicken " eben genau das: In die Wüste schicken , In die Ferne schicken wo es keinen interessiert.

    Und es mag vielleicht funktionieren aber besser er Versteht nicht nur die Unterschiede sondern auch Wieso "er" das so macht, was das bewirkt und wie es auch anders ginge bzw ob das überhaupt so der richtige Weg wäre...

Jetzt mitmachen!

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