PHP - Trigger?

  • Ein herzliches Hallo erst einmal an Alle!


    Ich bin ganz neu in der Pi-Welt, habe aber schon einige Erfahrungen mit php,SQL & Co sammeln dürfen. Hier also nun mein erster Post :bravo2:
    Ich habe viele Dinge im Kopf, die ich gerne ausprobieren möchte, 433mhz, Infrarot, Templogging,... usw... und finde es erstmal toll, dass es diese Forum hier gibt - und das hilft zu vielen Dingen einen Zugang zu finden.


    Alles was ich mache, soll letztendlich über eine Weboberfläche bedienbar sein. Auch nach langem Lesen bleiben mir aber zwei grundsätzliche Fragen.


    1) GPIO Steuerung über PHP
    An den meisten Stellen sehe ich eine Steuerung über shell_exec()... mal mit wiringpi, mal ohne... ist das wirklich die eleganteste Methode? Oder wie realisiert man das am besten?


    2) Triggern


    Die Frage ist für mich noch so ein bisschen, was kann eine Aktion auslösen. Der einfachste Fall.
    "Licht an" über einen Klick im Browser, Script wird aufgerufen, dass den GPIO schaltet - easy


    aber was ist mit dem umgekehrten Fall?


    Wenn ich z.B. möchte, dass ein Script auf irgendetwas was vom GPIO kommt reagiert? Also z.B. eine Statusänderung registriert und dann ein Script aufruft?


    Ideen die ich bisher dazu hatte.
    - Man könnte einen Cron laufen lassen, der alles abprüft was man möchte, und dann die Aktionen startet. Die Reaktion kommt dann aber nicht sofort, sondern wird nur minütlich abgeprüft --> blöd


    - ein phyton script läuft in der dauerschleife und ruft dann die php auf, die Aktionen verarbeitet --> auch irgendwie blöd...



    Ich bin doch sicher nicht der erste, der an den Punkt kommt. Wie habt ihr das gelöst?



    Besten Dank euch schonmal allen - und gute Nacht! ;)

  • Zu deiner ersten Frage:


    Es gibt prinzipiell viele Möglichkeiten die aber alle mehr oder wenig aufwendig sind die GPIOs aus PHP heraus zu steuern. Zum einen An/Aus gannst du den weg nehmen den das Betriebssystem ohne weiteres unterstützt, also unter /sys/... die GPIOs aktivieren, die richtung einstellen und dann auslesen (das muss aber nach jedem Neustart wiederholt werden). Als zweites gibt es noch die möglichkeit mit writingpi über die Kommandozeile was das ganze schon wesentlich vereinfacht, als optimale Lösung, die aber etwas mehr Aufwand beim einrichten erfordert, sehe ich die writingpi PHP Extension mit der du direkt die GPIOs mit PHP Funktionen und Methoden steuern kannst. Für mein aktuelles Projekt (RPi SmartHome Control) nehme ich die 2. möglichkeit und nutze writingpi über die Kommandozeile.


    Zur Zweiten Frage:


    eine Triggerfunktion ist mir so nicht bekannt, wenn du sowas haben willst wird das wohl immer mit einem Daemon enden. Also ein Script/Programm welches in Dauerschleife läuft und auf Statusänderungen wartet. Das lässt sich in so gut wie jeder Programmiersprache machen. In Verbindung mit den GPIOs ist da Python natürlich im Vorteil aber auch in PHP geht so etwas (da sollte man aber auf die writingpi PHP Extension setzen).

  • Zu Deiner zweiten Frage: WiringPI (und andere) haben eine Funktion zum Registrieren eines Interrupt Handlers. Du lässt also Dein Programm laufen und wenn der entsprechende Interrupt ausgelöst wird, kannst Du aktiv werden.


    Es gibt da entsprechende Beispiele auf Gordons Seite.

  • Wenn du Änderungen auf der Webseite anzeigen willst nimm AJAX.
    Dabei wird per Javascript (setTimeout) der Inhalt eines DIV alle X sek. neu aufgerufen ohne das du an der Webseite irgend etwas machst.

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?


    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Ajax und co ist mir klar, aber danke!!


    Interrupt handler in wiring pi? wo finde ich "gordon's" seite? ;)

  • Der_Imperator: Das ist setInterval. Set Timeout ist nur einmalig.


    p3pp0: An dieser Stelle wirst Du wohl kaum um Ajax herumkommen. PHP ist dahingehend ausgelegt dass dein Script nach X Sekunden (idr. 30), erfolgreich oder nicht, beendet wird. Selbst wenn Du darin eine Endlosschleife definierst bricht das Script nach den besagten X Sekunden ab. Folglich bleibt Dir dahingehend nur der Weg über Ajax und setTimeout/setInterval regelmäßige Abfragen zu starten sofern Du nicht auf eine Sprache wie C, Java oder ähnliches umsteigen willst.


    Nebenbei noch ein Tip: Statt setInterval empfehle ich Dir auf setTimeout zu setzen und zwar so, dass Du die Anfrage in eine eigene Funktion packst, sie dann 1x ausführst, und deinem Ajax Request ein Responsecallback hinzufügst, der ein Timeout auf deine Anfrage setzt. So kannst Du die Antwort des Servers in Ruhe bearbeiten bevor Du eine neue rausschickst und verhinderst so, dass Dein Script unkontrolliert Anfragen sendet und mit Responses zugeflooded wird.


  • PHP ist dahingehend ausgelegt dass dein Script nach X Sekunden (idr. 30), erfolgreich oder nicht, beendet wird. Selbst wenn Du darin eine Endlosschleife definierst bricht das Script nach den besagten X Sekunden ab.


    Jein. Grundsätzlich schon richtig, allerdings kann man auf die php.ini default Einstellung Einfluss nehmen zum Beispiel so:

  • Jein. Grundsätzlich schon richtig, allerdings kann man auf die php.ini default Einstellung Einfluss nehmen zum Beispiel so:[code=php]ini_set("max_execution_time","300");[/php]300 Sekunden = 5 Minuten


    Ja, aber dann bist Du immernoch auf 5 Minuten beschränkt. :)


  • Mit 0 setzt man eine unendliche Ausführungszeit ... :D
    Siehe: http://us2.php.net/set_time_limit


    Aber mein Post zeigte nur auf dass das Script nicht auf 30 Sekunden begrenzt ist sondern man darauf durchaus Einfluss nehmen kann


    Und ich sagte auch nicht dass man auf 30 Sekunden begrenzt ist sondern dass es idr. 30 Sekunden per Defaulteinstellung sind. ;)


    Beim Setzen auf 0 sollte man das Script dann aber trotzdem extern starten, sonst sammelt der Webserver Threads die er nie zu Ende führt sofern man sie selbst nicht beendet. ;)

  • PHP ist dahingehend ausgelegt dass dein Script nach X Sekunden (idr. 30), erfolgreich oder nicht, beendet wird.
    Selbst wenn Du darin eine Endlosschleife definierst bricht das Script nach den besagten X Sekunden ab.


    Das verstehe ich anders aber nun auch egal... Mittlerweile wurde geklärt das es nicht fest nach X Sekunden beendet wird sondern man darauf Einfluss nehmen kann (nochmal wiederhole ich das nun aber nich...)


    Auf 0 stellen ist aber auch kein Problem solange das Script sich "irgendwann" selber beendet - hab ich selber schon oft genug verwendet, eben für umfangreichere Scripts die unterschiedlich lange brauchten je Durchgang..


    "extern starten" klingt aber auch seltsam.. Wenn man ein php Script über Konsole ausführt kann der Webserver auch aus sein, der is in einem solchen Fall davon unabhängig

  • Tach auch ...
    wieder was dazu gelernt.
    Wobei ich ein automatisches Abwürgen eines script als zusätzliche Fehlerquelle ansehe (da muss man erst mal draufkommen, dass nach einer gewissen Zeit Schluss ist) und es damit imho in der Kategorie "Nützlich wie ein Kropf" abzulegen ist.


    cu,
    -ds-

  • Nochmal als Anmerkung, um die Ausführungszeit in PHP zu deaktivieren sollte man folgende beide Funktionen am Anfang des Scriptes setzen;

    Code
    //max_execution_time auser Kraft setzen
    set_time_limit(0);
    //direkte ausgabe der Daten
    ob_implicit_flush();


    man kann auch die max_execution_time auf null oder nach ober setzen was aber wenig Sinn bringt da dies dann alle Scripte betrifft (bzw. die Scripte die im Konfigurierten Modus laufen [also als Apache Modul, CLI oder CGI]).


    Diese Funktion kann und sollte man wenn sie nicht benötigt wird auch in die deaktivierten Funktionen mit rein nehmen da falls in irgendeiner Form Schadcode eingeschleust wird sonst der Webserver auf stunden lahm gelegt werden kann.


  • man kann auch die max_execution_time auf null oder nach ober setzen was aber wenig Sinn bringt da dies dann alle Scripte betrifft (bzw. die Scripte die im Konfigurierten Modus laufen [also als Apache Modul, CLI oder CGI]).


    Da muss ich dir leider wiedersprechen agent47
    Lest euch mal das hier aufmerksam durch: http://us2.php.net/manual/de/i…hp#ini.max-execution-time



    Das betrifft aber auch nicht alle PHP Scripts sondern nur die, die miteinander verkettet sind, also wo ein "include" oder "require" ein anderes PHP Script mit einfügt..
    Wird aber ein anderes PHP Script vom Nutzer aufgerufen verwendet das erneut die php.ini Einstellungen bis im Script etwas anderes festgelegt wird



    Code
    //direkte ausgabe der Daten
    ob_implicit_flush();


    Das funktioniert in der Form leider oft nicht immer sondern erst so:

    Code
    ob_implicit_flush(true);
    @ob_end_flush();


    Das ' @ ' bewirkt das mögliche Fehlermeldungen ebenso wie Rückgabewerte (ob_end_flush(); gibt TRUE oder FALSE zurück) unterdrückt werden


    Auch dazu am besten das hier durchlesen: http://us2.php.net/manual/de/function.ob-implicit-flush.php




    Aber wir schweifen ab - es wurden jetzt denk ich genug Äusserungen zu max_execution_time oder ähnlich getätigt, die dem ThemenErsteller aber vermutlich nicht wirklich hilfreich sind...

  • les dir bitte nochmal meinen text durch, da wirst du sehen das der teil den du hier so ausschweifend kommentiert hast sich auf die max_execution_time in der php.ini bezieht und nicht auf die funktion