Michael: max_execution_time in PHP.ini - Unklarheit

Hallo zusammen

Ich habe eine Unklarheit betreffend der Variable max_execution_time in der PHP.ini. Die Definition dafür lautet wie folgt:

<<<Dieser Wert gibt die maximale Ausführungslänge eines Skriptes in Sekunden an, bevor es vom Parser abgebrochen wird. Dieses soll Abstürzen des Servers durch schlecht geschriebene falsche Skripte vorbeugen.>>

Mir hat sich nun eine Frage gestellt.

Angenommen ich schreibe ein umfangreiches Script (Programm) welches sehr modular aufgebaut ist, jedoch von einer Datei aus gesteuert wird. Diese eine Datei muss ich starten und der Rest der Module wird über include eingebunden. Das Script dauert dann eine lange Zeit (einiges höher als der Wert der max_execution_time) bis es fertig ist. Meine Frage nun: In diesem Fall wäre es ja so, dass infolge der include()-Anweisungen ständig von Script zu script gesprungen wird. Wenn nun jedes einzelne Script weniger lang als der in der Variable max_execution_time eingegebene Wert dauert, wird dann das Hauptscript abgebrochen oder nicht?? Oder gilt der Wert max_execution_time unabhängig davon, wieviele Dateien mit Includes miteinander verbunden sind? Konkreter formuliert: Gilt die in der Variable max_execution_time angegebene Dauer für ein ganzes (mit include ineinander verhacktes) Programm, oder gilt er für ein einziges Script, sprich für jeweils eine einzige php-Datei?

Ich wäre froh wenn mir da jemand helfen könnte. Schon herzlichen Dank im vorraus!!

Gruss, Michael

  1. Hallo!

    Die Definition dafür lautet wie folgt:

    <<<Dieser Wert gibt die maximale Ausführungslänge eines Skriptes in Sekunden an, bevor es vom Parser abgebrochen wird. Dieses soll Abstürzen des Servers durch schlecht geschriebene falsche Skripte vorbeugen.>>

    Konkreter formuliert: Gilt die in der Variable max_execution_time angegebene Dauer für ein ganzes (mit include ineinander verhacktes) Programm, oder gilt er für ein einziges Script, sprich für jeweils eine einzige php-Datei?

    Der Wert gilt für ein gestartetes Script. Wenn Du dann irgendwas mit include einbindest ist das im Prinzip kein neu gestartetes Script, sondern Du erweiterst das aktuelle Script. Der Wert gilt für das Script was anfangs aufgerufen wurde. Egal was Du einbindest... die Laufzeit dieses gesamten "Programms" ist gemeint.

    Vielleicht hilft Dir: http://de3.php.net/set-time-limit
    http://de3.php.net/manual/en/ref.info.php#ini.max-execution-time

    Grüße
    Andreas

    1. Danke für die Links - durch die Suche in Google bin ich auch schon mal dort gelandet :-)

      Mit deiner Antwort sind nun meine Unklarheiten keine Unklarheiten mehr - danke!

      gruss, Michael

  2. Moin Michael,

    einander verbunden sind? Konkreter formuliert: Gilt die in der Variable max_execution_time angegebene Dauer für ein ganzes (mit include ineinander verhacktes) Programm, oder gilt er für ein einziges Script, sprich für jeweils eine einzige php-Datei?

    da Du die Dateien mit include einbindest, machst Du aus dem
    "Hauptscript" ein einziges großes Script. Die max_execution_time gilt
    also für das Hauptscript.

    regds
    Mike

    1. Nochmal Moin Michael,

      selbst wenn du max_execution_time in der ini hochsetzt, wird
      die spätestens der CGI Timeout dein Script beenden.

      Beim IIS steht dieser Timeout per default auf 900 Sekunden

      regds
      Mike

  3. Hello Du Einer,

    ... dann geb ich meinen Senf auch noch dazu:

    Wenn Du in einem Script die sleep()-Funktion benutzt, scheint die Execution-time von vorne zu beginnen. Das kann aber nur ein Bug sein, or is it a feature?

    Jedenfalls zählt nur die Netto-Ausführungszeit. Sleep-Sequenzen zählen keinesfalls dazu. Man sollte aber bei Benutzung von Sleep() im Script selber dafür Sorge tragen, dass es irgendwann endet, spätestens mit dem Abbruch der "Verbindung" mit dem Client.

    Diese Zeile sollte dann wesentlicher Bestandteil des Scriptes sein:

    while (!connection_aborted())

    Es kann sonst passieren, dass man beliebig viele Instanzen verbrät für nutzlos weiterlaufende Scripte.

    ------------------------------------------------------------
    <?php #### connection.php ####

    Testet auf Userabort

    set_time_limit(1);

    echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.1 Transitional//EN">\n";
    echo "<HTML>\n";
    echo "<HEAD>\n";
    echo "  <TITLE>Dauerlauf</TITLE>\n";
    echo "</HEAD>\n";
    echo "<BODY>\n";

    $ok = ignore_user_abort();
    echo $ok."<br />";

    while (!connection_aborted())
    {
      $dir = @mkdir("test");
      $fehler = $php_errormsg;

    echo getmypid()." ".time()." $fehler ".(($dir===false)?"FALSE":"TRUE")."<br />";
      flush();
      sleep(1);
    }

    echo "</body>\n";
    echo "</html>";
    ?>
    -------------------------------------------------------

    Kleines Spielprogramm zu dem Thema...

    Das mkdir steht nur drin, um einen Fehler zu provozieren. Es provoziert aber leider keinen Kanal-Fehler. Musst Dir also was anderes ausdenken dafür; z.B. fopen() auf eine nicht freigegebene Ressource.

    Wenn nämlich ein File-Channel-Error vorliegt, funktioniert flush() nicht mehr ordnungsgemäß.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Moin!

      while (!connection_aborted())

      Genial... das hat mir noch in meinem abuse- Skript gefehlt. (ich will diejenigen Spammer ein wenig teerboxen, die auf der Suche nach unsicheren Mailform- Skripten eines gewissen Matt sind. Und da kommen pro Monat doch einige vorbei. Wenn ich jetzt die Anzahl der Webauftritte rechne, dann würde es schon etwas bringen, wenn jeder zehnte der Webseitenbetreiber sowas einbaut...

      Zum Testen:

      www.fastix.de/whois.php

      (Bitte _keinen_ Link daraus bauen, die Suchmaschinen sollen dies _nicht_ listen. Und es geht kein Mail an den Abuse, wenn das Skript so aufgerufen wird.)

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
      1. Hello,

        while (!connection_aborted())
        Genial... das hat mir noch in meinem abuse- Skript gefehlt. (ich will diejenigen Spammer ein wenig teerboxen, die auf der Suche nach unsicheren Mailform- Skripten eines gewissen Matt sind. Und da kommen pro Monat doch einige vorbei. Wenn ich jetzt die Anzahl der Webauftritte rechne, dann würde es schon etwas bringen, wenn jeder zehnte der Webseitenbetreiber sowas einbaut...

        Zum Testen:

        www.fastix.de/whois.php

        (Bitte _keinen_ Link daraus bauen, die Suchmaschinen sollen dies _nicht_ listen. Und es geht kein Mail an den Abuse, wenn das Skript so aufgerufen wird.)

        Nun hoffe ich nur, dass Du nicht wirklich meinen Abuse informiert hast. Die sind nämlich nicht die Hellsten bei Tiscali und wenn ich mit denen dann endlich klar bin, was Sache ist, kommt als nächstes die Elebum und fragt, was denn los ist...

        Kannst Du noch mal in drei bis vier Sätzen (oder fünf) erklären, worum es da geht? Das habe ich jetzt nicht gleich geschnallt. Wieso soll die Connction solange aufrecht erhalten bleiben, bis der Server (nehme ich mal an) ein timeout macht und die Connection schließt?

        Wenn Du dem kein Futter gibst, wird der sowieso irgendwann zumachen.

        Du müsstest einem Spam-Crawler (also einem, der email-Adressen sammelt) auch welche anbieten:

        "Die eMailadresse der Bundesregierung lautet: .... "
        "Wenn Sie Fragen zu Geld haben, wenden Sie sich z.B. an:
          - ...bank1
          - ...bank2
          --

        "

        Und das dann rüberschieben.

        Die Adressen sind natürlich nicht ernst gemeint, nur so als Denkanstoß.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Moin!

          Das Teerboxing hast Du wahrscheinlich nicht mal bemerkt: Die Seite lädt munter weiter. Die Warnung ist nur für diejenigen die es per Hand versuchen, Spammers Skript wird (hoffentlich) brav warten, bis die Seite zu Ende geladen ist. Und genau da setze ich ich an und schicke aller 5 Sekunden " .", also ein Leerzeichen und einen Punkt. (Ganz unten...) Da ist es schon wichtig zu wissen, ob der Client noch brav lauscht... Sonst macht das Skript bis zum Timeout weiter und den habe ich ziemlich hoch gesetzt (auf 5 Minuten...) Das dürfte das böse Skript eines Spammers gehörig ausbremsen. Normalerweise versuchen die einfach das mailform.pl / mailform.cgi /formmail.pl ... zu finden und testen dann dessen Funktion, indem die sich selbst ein Mail mit der Adresse des hosts und der Datei senden.

          Ach ja. Abuses Mailadresse ermittle ich via whois -h whois.cyberabuse.org IP_des_Rechners.
          Diese hole ich aus den Servervariablen und extrahiere sie gegebenenfalls aus der Liste, die die Proxys mitschicken. Der Abuse des Spammers bekommt die Meldung über den abusiven Zugriffsversuch und eine Zeile "Apache- Log"... Deshalb soll ja die Seite in keiner Suchmaschine auftauchen.

          Den Quelltext gebe ich an die Öffentlichkeit raus, wenn das Ding perfekt läuft, was bis jetzt geht ist nur ein Anfang :)

          Es gibt also ein wenig zu tun: Ich will zusätzlich noch ein paar Überraschungen für die Spammer einbauen (Vortäuschung der Existenz des !gesuchten! Skriptes... dazu gehört Versenden der Testmail an den Spammer selbst, deren Registrierung und Information des Abuse bei dem anschliesenden Versuch des Massenversandes mit Weiterleitung des Spammails selbst und aller Verbindungsversuche des Spammers.)

          Er ist insgesamt eher trivial, macht aber eine Menge Arbeit....

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.