PHP Skript im Hintergund laufen lassen

  • Hallo liebe Forum Mitglieder,

    ich benötige einmal eure Hilfe, denn auch mit Hilfe von Google fand ich keine Lösung für mein Problem.

    Ich habe ein Raspberry den ich im Garten eingesetzt habe der einige Funktionen ausführt. So zb. die komplette Steuerung meines Fischteich.

    Es fuktioniert alles super. Jetzt möchte ich die Bewässerung des Rasen auch über den Raspberry steuern. Dafür habe ich ein Skript mit 3 Button "Ein, Aus, Auto".

    Das ein und ausschalten ist kein Problem nur die Automatische Bewässerung bekomme ich nicht hin.

    Die Skripte dazu sehen so aus.


    Auszug von SprinklerControl.php


    <article>

    <div id="Menue">

    <?php include('../include/menue.php'); ?>

    </div>

    <div id="Inhalt">

    <?php

    include('../sprinkler_php/datenbank_abfrage.php');

    include('Sprinkler.php');

    ?>

    </div>

    </article>

    <div id="Footer">

    <?php include ('../include/footer.php'); ?>

    </div>


    aus der Datenbank wird der derzeitige Zustand des GPIO ausgelesen und in der Variable $sprinkler01 gespeichert


    Skript Sprinkler.php


    if($sprinkler01 == "aus") {

    echo ".....in der oberen Ebene....";

    echo "<a href='../sprinkler_php/relais01ein.php' target='_self'><button class='buttonSprinklerEin'>ein</button></a>";

    echo "<a href='../sprinkler_php/relais01auto.php' target='_self'><button class='buttonSprinklerAuto'>auto</button></a>";

    }

    if($sprinkler01 == "ein") {

    echo "<a href='../sprinkler_php/relais01aus.php' target='_self'><button class='buttonSprinklerAus'>aus</button></a>";

    echo "<a href='#' target='_self'><button class='buttonSprinklerDeaktiv'>auto</button></a>";

    echo ".......jetzt in der unteren Ebene...";

    }

    if($sprinkler01 == "auto") {

    echo "<a href='#' target='_self'><button class='buttonSprinklerDeaktiv'>aus</button></a>";

    echo "<a href='#' target='_self'><button class='buttonSprinklerDeaktiv'>auto</button></a>";

    include ('../sprinkler_php/relais01auto_aus.php');

    }


    entsprechend der $sprinkler01 werden die Button farblich gestaltet

    Wenn jetzt der Button "auto" betätigt wird rufe ich folgenden Skript auf:


    relais01auto.php


    <?php

    exec("gpio -g write 4 0");

    $variable = "auto";

    $db = new SQLite3("/var/www/html/sqlite/datenbank.db");

    $query = $db -> query ("select * from Garten");

    $query = $db->query("Update Garten set Sprinkler01 ='".$variable."'");

    sleep(60);


    exec("gpio -g write 4 1");

    $variable = "aus";

    $query = $db -> query ("select * from Garten");

    $query = $db->query("Update Garten set Sprinkler01 ='".$variable."'");


    echo "<script LANGUAGE=\"JavaScript\">top.location=\"../web/SprinklerControl.php\"</script>";

    ?>


    Und hier habe ich das Problem.

    Bedingt durch die Wartezeit, wird die Hauptseite nicht neu aufgerufen und dadurch die Button aktualisiert.


    Gibt es eine Möglichkeit, das Skript so auszuführen, das Trotz der Wartezeit das Hauptmenue wieder aufgerufen wird und somit die Button aktualisiert werden?


    Das wäre für mich wichtig, da von der größe meines Rasen die Bewässerung in 4 Bereiche aufgeteilt sind.

    Und ich sehen kann welche Fläche gerade bewässert wird.

  • Hallo,


    das `sleep` blockiert halt deinen Response.


    Du musst das ganze so programmieren, dass du serverseitig eine REST-ähnliche API hast, über die die Client mit JavaScript bzw. dessen fetch-API kommuniziert.

    Dazu müsstest du die Steuerung der Ventile von Dartellung der Webseite entkoppeln. Keine Ahnung, wie das mit PHP geht (mit Python könnte ich dir das zeigen ;) ), aber das wird sicherlich gehen, weil das in keinster Weise exotisch ist, sondern realativ oft gebraucht wird.


    Gruß, noisefloor

  • Danke noisefloor,


    habe mir auch gedacht, das ich nicht der einzige bin, aber wie gesagt bis jetzt habe ich keine Lösung finden können.

    Wenn du mir eine Lösung in Python sagen kannst, ist mir das auch recht. Es muss nicht unbedinkt php sein.

    Leider kenne ich mich in den Programmier Sprachen nicht so gut aus. Das meiste wissen habe ich in PHP deswegen habe ich es in PHP versucht.

    Wobei das auch nur ein kleines Grundwissen ist.

    Ich wäre dir sehr Dankbar wenn du mir einen Lösungsvorschlag in Python geben könntest.

  • Ist keiner hier, der mir einen helfen kann?


    Ich habe gelesen das es möglich sei, wenn man ein Skript mit "system" Aufruft, das dann das Haupt Programm weiterläuft.

    Habe das auch schon probliert. In dem ich relais01auto.php im Haupt Programm aufgerufen habe. Hat aber auch nicht funktioniert.

    Es muss doch eine einfache Lösung für mein Problem geben.

    Mein Ziel ist ja nur, das sich die Botton farblich kennzeichen, das die Automatische Bewässerung eingeschaltet ist.

  • Wenn in einem PHP-Script ein separater Prozess gestartet werden soll, der das aktuelle Programm nicht blockiert, musst du das zweite Programm im Hintergrund laufen lassen. Dabei sind die Ausgaben des Prozesses umzuleiten. Bei deinem Beispiel sollte also folgendes funktionieren:


    Code
    shell_exec('gpio -g write 4 1 >/dev/null 2>&1 &');
  • Hallo,


    Quote

    musst du das zweite Programm im Hintergrund laufen lassen.

    Das "musst" ist hier falsch. Kann man, muss man nicht. Sauber ist das auch nicht, weil der TE ja wissen will, ob der Prozess noch läuft. So ist der Prozess entkoppelt.

    Sauberer ist, wenn man nebenläufig eine Worker-Thread oder Prozess laufen lässt, der über eine REST-ähnliche API gesteuert wird und mit dem man auch kommunizieren kann. Wurde oben ja schon in ähnlicher Form erwähnt.


    Robby: der eigentliche Punkt ist: die Problemstellung hört sich relativ trivial an - ist sie aber nicht, weil die irgendeine Form von Nebenläuifigkeit willst / brauchst, und das nun mal nicht trivial ist.


    Gruß, noisefloor