Anzeige:
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 34

Thema: set_time_limit ausser gGefecht?

  1. #1
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825

    set_time_limit ausser gGefecht?

    Hallo Leute,

    habe mir gerade einen Anschiß vom Admin geholt.
    Grund: ich habe php dazu mißbraucht, ein paar Random-Tabellen zu erstellen.

    Erste Anweisung im Script ist zwar:

    set_time_limit(30);

    beim ersten Durchlauf bricht er auch brav ab, aber beim 2. Aufruf
    scheint der Indianer das irgendwie zu ignorieren und rennt bis zu 5 Minuten weiter bei CPU-Vollast. (Screen-Output ist lang schon beendet)
    Schön für meine Tabellen, schlecht für Stimmung vom Admin.

    System:
    php5 auf gentoo-amd64, diese Woche upgedatet (bleeding edge)
    php.ini maximum execution time ist ungefähr 5 min.

    Aber wieso ignoriert der Bursche mein time_limit?

    so long,
    BlueJay
    Eigentlich ganz einfach, wenn man's weiss!

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Hmm vielleicht das hier:

    "Achtung: Wenn PHP im Safemode läuft, hat set_time_limit() keinen Effekt. Die einzige Möglichkeit, dies zu umgehen, ist den Safemode im configuration file auszuschalten."

    Aber das würde natürlich nicht erklären warum es einmal ging und einmal nicht.
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  3. #3
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von BlueJay Beitrag anzeigen
    Hallo Leute,

    habe mir gerade einen Anschiß vom Admin geholt.
    Grund: ich habe php dazu mißbraucht, ein paar Random-Tabellen zu erstellen.

    Erste Anweisung im Script ist zwar:

    set_time_limit(30);

    beim ersten Durchlauf bricht er auch brav ab, aber beim 2. Aufruf
    scheint der Indianer das irgendwie zu ignorieren und rennt bis zu 5 Minuten weiter bei CPU-Vollast. (Screen-Output ist lang schon beendet)
    Schön für meine Tabellen, schlecht für Stimmung vom Admin.

    BlueJay
    Bist Du dir sicher, das Du den Wert von set_time_limit innerhalb deiner
    Schleife überschreibst? Poste doch mal den entsprechenden Teil deines
    Scriptes.
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  4. #4
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zitat Zitat von BlueJay Beitrag anzeigen
    Hallo Leute,

    habe mir gerade einen Anschiß vom Admin geholt.
    Grund: ich habe php dazu mißbraucht, ein paar Random-Tabellen zu erstellen.

    Erste Anweisung im Script ist zwar:

    set_time_limit(30);

    beim ersten Durchlauf bricht er auch brav ab, aber beim 2. Aufruf
    scheint der Indianer das irgendwie zu ignorieren und rennt bis zu 5 Minuten weiter bei CPU-Vollast. (Screen-Output ist lang schon beendet)
    Schön für meine Tabellen, schlecht für Stimmung vom Admin.

    System:
    php5 auf gentoo-amd64, diese Woche upgedatet (bleeding edge)
    php.ini maximum execution time ist ungefähr 5 min.

    Aber wieso ignoriert der Bursche mein time_limit?

    so long,
    BlueJay
    Klassischer Speicher Fehler. Zeige mal den Code
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  5. #5
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Hier ist der Code, der die arme CPU auf 100% Last trieb und angeblich auf
    fast 60 Grad: (bei 60 fährt der Server runter)

    (Ich gebe ja zu, dass ich php als Random-Generator missbraucht habe, aber ich brauche erstens prüf- und wiederholbare Sequenzen, zweitens habe ich so was schneller in php zusammengestrickt als in C++, drittens spielt die Zeit für die Erstellung keine Rolle, viertens läuft der Kram im .htaccess-geschütztem Bereich, fünftens MUSS der Apache der Owner des fertigen Files sein.)

    Code:

    PHP-Code:
    <?php

    // bingokarten:
    $dpfad="/var/xxxxxxxxxxxxxxxxxxxxxxxxxx/"// später mal extra-Verzeichnis
    $filnam=$dpfad.'blue.csv';

    set_time_limit(30);

    // pattern einlesen:
    $nzeilen=18$nspalten=9;
    $zeilen=file('bingo.patt');
    for (
    $i=0$i<$nzeilen$i++)
    $d=split(',',$zeilen[$i]);
      for (
    $j=0$j<$nspalten$j++) $f[$i][$j]=intval($d[$j]);
    }
    for (
    $i=1$i<=90$i++) $arr[$i]=$i// Zahlenvorrat

    // ================================================================
    for ($satz=0$satz<100$satz++)
    {
    do
    { echo 
    "<br>Starte Satz - $satz :<br>";
      
    mischen($arr,1,9);
      for (
    $i=1$i<8$i++) mischen($arr,10*$i,10*$i+9);
      
    mischen($arr,80,90);
      
    $out='';
      for (
    $i=0$i<$nzeilen$i++)
      { for (
    $j=0$j<$nspalten-1$j++) if ($f[$i][$j]==0$out=$out.'0,'; else $out=$out.$arr[$f[$i][$j]].',';
        if (
    $f[$i][$nspalten-1]==0$out=$out."0\n"; else $out=$out.$arr[$f[$i][$j]]."\n";
      }
      echo 
    $out;
    }
    while(
    dublette($filnam,$out)===true);

    if (
    $fh=fopen($filnam,"a")) { fwrite($fh,$out); fclose($fh); }
    echo 
    "<br>Kartensatz $satz fertig<br>\n";

    }

    exit();

    // ==============================================================================================================
    function in_liste($e,$l) { $k=0; if (count($l)>1) for ($i=1$i<=$l[0]; $i++) if ($e==$l[$i]) $k=$i; return $k; }
    function 
    add_liste($e,&$l) { if (in_liste($e,$l)<1) { $l[0]++; $l[$l[0]]=$e; } }
    // ---------------------------------------------------------------------------------------------------------------

    function mischen(&$a,$von,$bis)
    { for (
    $i=$von$i<=$bis$i++) 
      { 
    $k=rand($von,$bis);
        
    $e=$a[$i]; $a[$i]=$a[$k]; $a[$k]=$e;
      }
    }

    function 
    dublette($infile,$neu)
    $dub=false;
      
    $zeilen=@file($infile);
      if (
    count($zeilen)>1) for ($i=0$i<count($zeilen); $i++) if (!$dub)
      { 
    $a0[0]=0$a1[0]=0$z0=split(',',$neu); $z1=split(',',$zeilen[$i]); $dub0=true;
        for (
    $j=0$j<count($z0); $j++) if ($z0[$j]>0add_liste($z0[$j],$a0);
        for (
    $j=0$j<count($z0); $j++) if ($z0[$j]>0add_liste($z1[$j],$a1);
        for (
    $j=0$j<=$a0[0]; $j++) if ($a0[$j]!=$a1[$j]) $dub0=false;
        if (
    $dub0$dub=true;
      }
      return 
    $dub;
    }

    ?>
    Apache-Daten kann ich leider nicht liefern, das hält der Admin geheim.

    A propos Speicherfehler:
    Spinnen die neueren CPUs ab 60 Grad tatsächlich schon rum? Die alte Amiga hat früher 3 Tage am Stück gelaufen, ohne aufzumucken.

    so long,
    BlueJay
    Geändert von BlueJay (14-12-2006 um 12:49 Uhr) Grund: Datenpfad geht keinen was an
    Eigentlich ganz einfach, wenn man's weiss!

  6. #6
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von mehlvogel Beitrag anzeigen
    Hmm vielleicht das hier:

    "Achtung: Wenn PHP im Safemode läuft, hat set_time_limit() keinen Effekt. Die einzige Möglichkeit, dies zu umgehen, ist den Safemode im configuration file auszuschalten."

    Aber das würde natürlich nicht erklären warum es einmal ging und einmal nicht.
    Safe mode ist off (Stand: heute morgen )

    Beim (jeweils) erstenmal hat die Sicherheitsgrenze ja auch zugeschlagen, dann startet man (via Refresh) nochmal, um die nächsten Sätze zu bekommen, und da ist das Script die vollen 5 CPU-Minuten durchgelaufen.
    Eigentlich ganz einfach, wenn man's weiss!

  7. #7
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Sorry aber deine Javascript Schreibweise ist in PHP Grauenvoll und Fehlerträchtig.
    Zum Fehler - du hast ein Speicherloch in der while Schleife.
    Und zwar deshalb weil die Funktion dublette() nach der Schleife kommt aber du setzt vor dublette() ein exit() Script Beenden.
    Das heist der Compiler sucht nach der Funktion und findet sie auch daher Mäckert er auch nicht - das einlesen wird aber zuvor Beendet.
    Setze die Funktion vor die Schleifen und Sehe noch mal was Passiert.
    Mal als Tip: Der PHP Interpreter liest von Oben nach Unten von Rechts nach Links die Scripte durch.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  8. #8
    Registrierter Benutzer Avatar von hds
    Registriert seit
    14.12.2006
    Ort
    Sprockhövel
    Beiträge
    35
    mal ne bloede zwischenfrage:
    muss das ueberhaupt ueber den apache laufen?

    es waere weitaus sinnvoller dieses script auf der commandline auszufuehren (per cron, 1mal taeglich, nachts).
    waere das moeglich?

    ich bin kein PHP freak, aber AFAIK habe ich das in erinnerung das man php scripte (genau wie python usw) natuerlich auch direkt auf der bash ausfuehren kann.

    dieses haette den vorteil, die php.ini der bash anders zu gestalten als die welche ueber den indianer laeuft.

  9. #9
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von undefined Beitrag anzeigen
    Sorry aber deine Javascript Schreibweise ist in PHP Grauenvoll und Fehlerträchtig.
    Sieht schon ziemlich heftig aus.
    Aber trotzdem muß die Hardware soetwas abkönnen, ob da nun
    Fehler im Script sind, oder nicht.
    Dann muß der Admin eben mal 1-2 Speicherblocke auswechseln.
    Außerdem eine Einstellung in der ini max_execution_time auf 5 Min.
    zu setzen halte ich für vollkommen übertrieben.

    Ich geh mal davon aus, das dies nicht dein eigener Server ist,
    sondern du dir einen Account (nen Stück Festplatte) gemietet hast.
    Da kann es natürlich sein, das noch andere Freaks den Rechner
    knuten und knebeln. Dann wird es natürlich eng.
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  10. #10
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von hds Beitrag anzeigen
    mal ne bloede zwischenfrage:
    muss das ueberhaupt ueber den apache laufen?

    es waere weitaus sinnvoller dieses script auf der commandline auszufuehren (per cron, 1mal taeglich, nachts).
    waere das moeglich?

    ich bin kein PHP freak, aber AFAIK habe ich das in erinnerung das man php scripte (genau wie python usw) natuerlich auch direkt auf der bash ausfuehren kann.

    dieses haette den vorteil, die php.ini der bash anders zu gestalten als die welche ueber den indianer laeuft.
    Die Idee ist ja nicht schlecht, aber bei einem Account hat Sie meist keinen
    Cron && || Shellzugriff.
    Das entlastet zwar den Indianer + RAM aber Prozessor glüht trotzdem.
    (Aber wie gesagt ich vermute nur, daß Sie nur einen Account hat.)
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  11. #11
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von undefined Beitrag anzeigen
    Sorry aber deine Javascript Schreibweise ist in PHP Grauenvoll und Fehlerträchtig.
    Die ANSI-Schreibweise ist wohl nicht der Grund für den Fehler.

    Eine do.. while-Schleife muss hier benutzt werden, weil
    erst der Datensatz erstellt,
    dann auf dublette geprüft wird.

    Also genau dieses Konstrukt, was nun mal diese spezielle Syntax hat:
    http://de.php.net/manual/en/control-...s.do.while.php

    Zum Fehler - du hast ein Speicherloch in der while Schleife.
    Und zwar deshalb weil die Funktion dublette() nach der Schleife kommt aber du setzt vor dublette() ein exit() Script Beenden.
    Das wäre richtig, wenn vor dem while ein Semikolon stünde.
    PHP arbeitet diese Schleife ja auch korrekt ab (nix Speicherloch), gemeckert wird nix, die Datenblöcke werden, wenn vollständig und ohne Dublette, korrekt geschrieben.

    Setze die Funktion vor die Schleifen und Sehe noch mal was Passiert.
    Eine 1a-Bauchlandung wegen fehlender Daten, schont natürlich die CPU

    Nee, schon verstanden!
    Geht nicht, weil die Daten erst in der do-while Schleife anfallen. Wieso soll ich eine Extra-Runde drehen und doppelten Code produzieren? DAS ist fehleranfällig!
    Vgl. hierzu auch den Kommentar in obigem Link.

    Der Knackpunkt vom Ganzen ist doch, dass er nach 30s nicht aufhört, zu rechnen, (ca. 17-30 Blöcke) sondern je nach max_execution_time bis zum bitteren Ende (40 - 100 Blöcke, sprich: bis zu 1800 Reihen) weitermacht und dabei die CPU anwärmt.

    Die Datei ist natürlich mittlerweile recht heftig

    Admin liest mit, da sage ich wohl besser nicht, dass ich so 18000 Zeilen anpeile
    Eigentlich ganz einfach, wenn man's weiss!

  12. #12
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von Romanday Beitrag anzeigen
    Sieht schon ziemlich heftig aus.
    Statistiker kennen keine Gnade!

    Außerdem eine Einstellung in der ini max_execution_time auf 5 Min.
    zu setzen halte ich für vollkommen übertrieben.
    Hat er mir zuliebe gemacht, weil ich aus den Logfiles Hitparaden erstellen wollte.
    Kann ich natürlich auch wieder lokal machen und dann wöchentlich updaten.
    Eigentlich ganz einfach, wenn man's weiss!

  13. #13
    Registrierter Benutzer Avatar von hds
    Registriert seit
    14.12.2006
    Ort
    Sprockhövel
    Beiträge
    35
    Zitat Zitat von Romanday Beitrag anzeigen
    Aber trotzdem muß die Hardware soetwas abkönnen, ob da nun
    Fehler im Script sind, oder nicht.
    natuerlich kann die hardware "das ab", dennoch kanns ja wohl nicht sein, das sich ein php script ueber den indianer <=100% cpu last schnappt, sprich: alles was es an cpu power bekommen kann.
    Zitat Zitat von Romanday Beitrag anzeigen
    Ich geh mal davon aus, das dies nicht dein eigener Server ist,
    sondern du dir einen Account (nen Stück Festplatte) gemietet hast.
    Da kann es natürlich sein, das noch andere Freaks den Rechner
    knuten und knebeln. Dann wird es natürlich eng.
    noe, laeuft sonst nix drauf. ist mein server <g> und meine frau <g>

    ansonsten wuerde ich die CPU last kaum sehen koennen, bei webspace, gell?

  14. #14
    Registrierter Benutzer Avatar von hds
    Registriert seit
    14.12.2006
    Ort
    Sprockhövel
    Beiträge
    35
    Zitat Zitat von Romanday Beitrag anzeigen
    Die Idee ist ja nicht schlecht, aber bei einem Account hat Sie meist keinen
    Cron && || Shellzugriff.
    bei mir schon.
    Zitat Zitat von Romanday Beitrag anzeigen
    Das entlastet zwar den Indianer + RAM aber Prozessor glüht trotzdem.
    exakt. hab fuer spass den eaccelerator eingebunden, hilft natuerlich bei CPU last garnix (chached nur und macht sharedmem, logo).

    also, wuerde es was bringen, das script (sofern bereinigt) auf der bash laufen zu lassen?

  15. #15
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von hds Beitrag anzeigen
    also, wuerde es was bringen, das script (sofern bereinigt) auf der bash laufen zu lassen?
    Da ist nix zu bereinigen, der braucht keine Parameter, und ob der nun mit ein paar Fetzen HTML-Code seinen Bearbeitungsstand rausgibt, ist für die Lesbarleit für mich wurscht.

    Fehlerbereinigung ist sowieso nicht, undefined braucht nach dem wohl für heutige Programmierer etwas unverdaulichem ANSI-Format nur eine längere Kaffeepause, um wieder zu wissen, wo oben und unten ist.
    Eigentlich ganz einfach, wenn man's weiss!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •