php script läuft auf apache unendlich.

  • Hallo,
    Ich hab bei einem php Script (am apache) gemerkt, dass es nach mehreren tagen noch fehlermeldungen erzeugt.
    Deshalb hab ich ein testscript geschrieben, um zu sehen, wie lange das script laufen kann.
    Das testscript schaltet alle 2 sekunden die act led um ( an und aus).
    Dann hab ich es mal einfach laufen lassen und die actled blinkt immernoch alle 2 sekunden.
    Und das mit apache2.
    In der php ini ( /etc/php5/apache2/php.ini):
    max_execution_time = 30

    Warum ignoriert der apache das?
    Wie kann ich verhindern, dass er das ignoriert?

    Mfg
    fabi

    Es ist zwecklos Programme idiotensicher zu machen.
    Die natur entwickelt dann einfach bessere ¡dioten.

    Einmal editiert, zuletzt von Fabi (19. August 2014 um 16:52)

  • Das Script tut ja fast nix in der Schleife.....
    Ok, es tut sleep() und Dateioperationen, aber die zählen nicht zu den 30 Sekunden.
    Die 30 Sekunden können so erstaunlich lang werden.

    phpinfo() zeigt dir ob deine PHP Einstellung überhaupt greift.

    spruch.png

  • Das heißt , dass die zeit, die das script braucht, nur die rechenzeit ist und nicht die gesamtzeit?
    Aber warum konnte sich mein erstes script über die 30 sekunden weiterrechnen?
    Das erste hat nur gerechnet und gespeichert, aber nicht nichts gemacht.

    Es ist zwecklos Programme idiotensicher zu machen.
    Die natur entwickelt dann einfach bessere ¡dioten.

  • Das Handbuch sagt:

    Zitat

    Hinweis:

    Die set_time_limit()-Funktion und die max_execution_time Konfigurationsdirektive beschränken nur die Ausführungszeit des Skripts selbst. Zeit die für Aktivitäten außerhalb des Skripts aufgebracht wird wie z.B. die Ausführung von Systemaufrufen mit system(), Streamoperationen, Datenbankabfragen usw. werden nicht in die Berechnung der Ausführungszeit mit einbezogen.


    Aus: http://php.net/manual/de/function.set-time-limit.php

    spruch.png

  • Ok wie kann ich dann die ausführung nach start des scriptes beenden, ohne andere scripte auch zu beenden?
    Oder kann man das nicht?

    Es ist zwecklos Programme idiotensicher zu machen.
    Die natur entwickelt dann einfach bessere ¡dioten.

  • Ich muss meinen Vorrednern leider widersprechen.

    Schaut man sich deine index.php an:

    Spoiler anzeigen

    [code=php]
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors','On');
    $g = $_GET["m"];
    $s = $_GET["s"];
    $l = "/sys/class/leds/led0/brightness";
    if($g == ""){
    $b = file_get_contents($l);
    echo $b;
    if($b == 1){
    file_put_contents($l,"0");
    echo "0";
    }else{
    file_put_contents($l,"1");
    echo "1";
    }
    }elseif($g == 1){
    $z = 1;
    for($i = 1;$i != 5;){
    $b = file_get_contents($l);
    echo $b;
    if($b == 1){
    file_put_contents($l,"0");
    echo "0";
    }else{
    file_put_contents($l,"1");
    echo "1";
    }
    echo $z;
    $z++;
    sleep($s))
    }
    ?>
    [/php]

    gibt es da keine im Sinne von "ewig laufen Schleife".

    Es gibt also auch kein Grund wieso das Script selbstständig die ganze Zeit laufen sollte.
    Und das wiederum bedeutet dass das Script von wo anders aufgerufen wird, also unabhängig vom Apache2 zu sein scheint! Es gibt in dem von dir angehängten Script KEINE Schleife! Die if Abfragen sind keine Schleifen, das sleep am Ende ist keine Schleife. Eine Schleife in dem von Euch gemeinten Sinn wäre zB ein while - ist in dem Script aber nirgends!


    Der Aufgruf des Scripts erfolgt also von wo anders - zum Beispiel über crontab ? Oder über deinen Browser, oder über irgendein anderes Script.
    Und das bedeutet das irgendwelche apache2 Einstellungen dann auch nicht greifen können - die müssten also wenn dann direkt im Script festgelegt werden; aber wie gesagt befindet sich im Script KEINE Schleife

    Der apache2 ist nur ein WebServer der dem Benutzer etwas anzeigt wenn er seinen Browser verwendet.

    Wenn das Script Fehler im error.log auswirft dann liegt das am Script selbst.
    Es bringt dann also nichts irgendwo ein exit(); einzubinden, das behebt nicht irgendein Problem. Vielmehr solltest du zum einen mal die Fehlermeldung posten, oder ein paar mehr Checks in das Script einbauen, zB indem du prüfst ob $_GET["m"] oder $_GET["s"] überhaupt existiert bzw gesetzt wurde bevor du damit arbeitest und Zustände prüfst

  • meigrafd
    Mir kommt da auch einiges spanisch vor....
    Aber vielleicht tröpfeln ja noch ein paar notwendige Informationen dazu ;)

    [code=php] for($i = 1;$i != 5;){
    $b = file_get_contents($l);
    echo $b;
    if($b == 1){
    file_put_contents($l,"0");
    echo "0";
    }else{
    file_put_contents($l,"1");
    echo "1";
    }
    echo $z;
    $z++;
    sleep($s))
    }[/php]
    Das ist eine Endlosschleife.

    Kürzer: (aber mit ähnlicher Wirkung)
    [code=php]while(1) sleep(3);[/php]

    spruch.png

    Einmal editiert, zuletzt von combie (19. August 2014 um 09:19)

  • Stimmt, die hab ich übersehen. :blush:

    Aber while(1) wäre der falsche Vergleich, da die for Schleife eigentlich nur so lange Wiederholungen durchläuft bis $i = 5

    Also wieso wundert er sich das die for-Schleife ewig läuft? So wie die aufgebaut is, ist das doch kein Wunder?

    Aber wozu sollte er dort nun ein exit(); einbauen? Es wäre doch irgendwie sinnvoller die for Schleife so zu programmieren wie es vorgesehen ist und $i innerhalb der Schleife zu erhöhen?!?

    Und wo wird die Schleife überhaupt geschlossen :huh:
    Entweder es fehlt das schließen ( } ) der for Schleife oder des elseif. Da der Code wirklich schwer lesbar geschrieben wurde mag das nicht sofort auffallen - würde man mehr Leerzeichen setzen oder Einrückungen, würde sowas auch besser auffallen:

    Spoiler anzeigen

    [code=php]
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors','On');
    $g = $_GET["m"];
    $s = $_GET["s"];
    $l = "/sys/class/leds/led0/brightness";
    if ($g == "") {
    $b = file_get_contents($l);
    echo $b;
    if ($b == 1) {
    file_put_contents($l,"0");
    echo "0";
    } else {
    file_put_contents($l,"1");
    echo "1";
    }
    } elseif ($g == 1) {
    $z = 1;
    for ($i = 1; $i != 5;) {
    $b = file_get_contents($l);
    echo $b;
    if ($b == 1) {
    file_put_contents($l,"0");
    echo "0";
    } else {
    file_put_contents($l,"1");
    echo "1";
    }
    echo $z;
    $z++;
    sleep($s))

    }
    ?>
    [/php](ich hab da mal eine Leerzeile eingefügt wo ein } fehlen könnte)

    Dabei aber auf max_execution_time zu setzen ist der falsche Weg.

    Und obwohl ich die Fehlermeldungen nicht gesehen habe bzw kenne bleib ich weiter dabei das in dem Script mehr Checks rein müssen

  • Zitat

    Und wozu sollte er dort nun ein exit();


    Das war die Antwort auf seine Frage.
    :D Vielleicht war die Frage ja auch falsch... :D

    Anders kommt man nicht wirklich aus einer Endlosschleife raus....
    Ok, "break" oder "die" würde es auch tun.

    [code=php]$ende = time() + 30;

    while(1)
    {
    if(time()>$ende) die("Ende erreicht");
    sleep(3);
    }[/php]

    spruch.png

  • Diese konkrete for Schleife entspricht faktisch einer while(1) Schleife.
    Ein while(1), an der Stelle, würde dem "Prinzip der geringsten Verwunderung entsprechen".
    Die Variante for( ; ; ) wäre auch akzeptabel.

    Und ja, Endlosschleifen haben in Webserverumgebungen nichts zu suchen.
    Und auch ja, "Seitenausstiege" aus Schleifen sind möglichst zu vermeiden.
    Weil schwer zu lesen. Unübersichtlich, usw...

    Zitat

    Der TE hat also meiner Ansicht nach 3 Fehler:


    :daumendreh2:Nö, Widerspruch!:daumendreh2:

    Es schießt da in seinem Code ein paar Böcke.
    Schreibt etwas unorthodox.
    Ich führe das mal auf mangelnde Übung zurück.
    Und das kann/wird sich ändern.
    Das Handbuch hat er jetzt hoffentlich gefunden.
    Also kann ich mich auf Besserung freuen.
    ;);)

    EDIT:
    Da hats mir doch glatt aus for( ; ; ), ohne Leerzeichen, for(;;) gemacht...

    spruch.png

    Einmal editiert, zuletzt von combie (19. August 2014 um 10:29)


  • :daumendreh2:Nö, Widerspruch!:daumendreh2:

    Siehst du die Fehler nicht?

    Die for Schleife wird zwar geöffnet aber nicht mehr geschlossen -> 1.Fehler
    In der im ersten Beitrag angehängte index.php, steht sleep($s)) ... Es fehlt das " ; " nach jedem PHP-Befehl und das ")" ist hier überflüssig -> 2.Fehler
    rein spekulativ sollte vermutlich anstatt ) ein } werden aber ist es eben nicht..

    Aufgrund dieser Fehler werden höchst wahrscheinlich auch haufenweise Fehlermeldung im error.log ausgegeben


    Da kannst du soviel Widerspruch ein legen wie du willst - diese Fehler sind nicht nur NOTICES sondern CRITICAL. Aber wie auch immer - mich nerven die User dieses Forums in letzter Zeit eh.... macht doch was ihr wollt :wallbash:

  • Wenn ich sie sehen will, dann sehe ich sie auch.....
    ;););)

    Für den Interpreter dürften es fatale Fehler sein.
    Der Eingangsfrage kann man ja schon entnehmen, dass das Script nicht das tut, was es soll.
    :D Und, warum es überhaupt das tut, was es nicht tun soll ist mir auch ein Rätsel. :D


    Wir sollten dem Fabi Zeit geben, sich da tiefer einzuarbeiten.

    Um noch was zu dem Script sagen zu können, hätte ich auch gerne gewusst, wie es aufgerufen wird. Per Browser kann ich auch kaum glauben, denn der hat ja seinen eigenen Timeout. Den Verbindungsabbruch sollte der Apache mitbekommen und darauf reagieren.

    Die GET Parameter deuten auf einen Aufruf über das HTTP.

    Auch wären die Meldungen wichtig....
    Ist schade, dass die geheim bleiben müssen, machts helfen nicht leichter.

    spruch.png

  • Also es geht hier ja auch nicht um mein prüfscript (das auch mehrere andere fehler hat)
    Sondern um ein anderes script, was durch den webserver eigentlich von selbst beendet werden sollte.
    und der Browser hat längst schon die seite geschlossen.
    Das prüfscript hab ich bevor ich es hochgeladen habe noch überarbeitet (syntaxfehler und ähnliches ausgebessert.) Und auf den pi geladen, aber nicht (aus versehen) am computer aktualisiert.Und es hat am pi auch keine fehler gegeben.
    Deshalb ist beim prüfscript nicht die Aktuelle Version.
    Aber darum geht es nicht.
    Das script, bei dem ich die lange Laufzeit bemerkt habe, verschlüsselt daten und speichert sie.
    es wird über den Browser gestartet und sollte nach der maximalen ausführzeit den entsprechenden fehler an den Browser senden.
    das hat es nicht und laut fehlerlog hat es alle paar stunden immer erneut gemeldet, dass ein array schlüssel fehlt.
    deshalb hab ich das testscript geschrieben.

    Es ist zwecklos Programme idiotensicher zu machen.
    Die natur entwickelt dann einfach bessere ¡dioten.

    Einmal editiert, zuletzt von Fabi (19. August 2014 um 17:01)

  • Ich hab jetzt mal ein neues testscript gemacht, was ich jetzt auch mit dem Browser gestartet habe. Und soweit ich jetzt sehe blinkt die actled weiter obwohl der browser nicht mehr auf die Antwort wartet.

    Die log Dateien und das script lade ich als zip hoch da der dateityp der logdateien hier nicht akzeptiert wird.
    Das testscript läuft jetzt auf einem eigenen virtual host, sodass ich auch neue logdateien habe.

    Edit: ich hab jetzt auch die aktuellen logdateien.

  • Wie ich bereits schon mal sagte musst du mehr Checks einbauen, wenn du Fehlermeldungen vermeiden willst...

    Die erste Fehlermeldung im error.log lässt sich sehr einfach verhindern

    Code
    [Tue Aug 19 19:38:44 2014] [error] [client 192.168.178.55] PHP Warning:  file_get_contents(x.txt): failed to open stream: No such file or directory in /var/www/245/index.php on line 13


    Indem du einfach vor dem file_get_contents Aufruf prüfst ob die Datei x.txt überhaupt existiert - und schwups kommt diese Fehlermeldung nicht mehr...

    Die Fehlermeldung

    Code
    [Tue Aug 19 19:39:47 2014] [error] [client 192.168.178.55] File does not exist: /var/www/245/favicon.ico, referer: http://192.168.178.245/

    kann man ignorieren - oder du erzeugst halt ne leere Datei /var/www/245/favicon.ico ...

    Die Fehlermeldung

    Code
    [Tue Aug 19 23:59:07 2014] [error] [client 192.168.178.55] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /var/www/245/index.php on line 14


    Ist das was du möchtest und lässt sich nur abschalten indem du die php Einstellungen im index.php entsprechend anpasst (zB display_errors ausschaltest)


    Ich versteh weiterhin nicht Wo eigentlich dein Problem is :huh:

    Du scheinst aber auch nicht zu verstehen was PHP von zB Javascript unterscheidet: PHP wird Serverseitig ausgeführt, Javascript Clientseitig. Dh PHP ist es egal ob der Browser noch eine Antwort erwartet


    Aber leider hast du noch immer nicht die Fragen beantwortet, wie du zB das Script aufrufst - oder was letztlich bewirkt werden soll, oder was nun eigentlich dein Problem is...

    Das der Code aus deinem ersten Beitrag nun mal fatale Fehler enthält hab ich dir ja schon aufgezeigt, das es damit dann halt Fehlermeldungen hagelt sollte klar sein.. Dein "neues" Script ist aber auch nicht viel besser - die for Schleife ergibt so wie sie im Script steht eigentlich keinen Sinn, oder viel mehr verstehe ich ohne Erklärungen von dir nicht den Sinn der dahinter stecken soll , Wieso du das so machst

  • Zu deinen fragen siehe gestern 16:45

    und ich verstrhe sehr wohl den unterschied zwischen php und javasct da ich javascript nicht kann, aber php schon.

    Es ist zwecklos Programme idiotensicher zu machen.
    Die natur entwickelt dann einfach bessere ¡dioten.

    Einmal editiert, zuletzt von Fabi (20. August 2014 um 14:18)

Jetzt mitmachen!

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