Skript mit langer Laufzeit verursacht Fehler

MasterDS

Erfahrenes Mitglied
Hallo!

Ich habe ein Problem mit einem Skript, welches lange läuft. Das Skript muss Cache-Dateien löschen. Das sind mitunter mehrere 100.000 Dateien mit mehreren GB auf dem FTP. Das ganze funktioniert auch wunderbar, nur gibt der Server irgendwann die folgende Meldung aus:

fehler.jpg

Im Skript habe ich schon folgende Werte gesetzt:

Code:
        ini_set('safe_mode','off');
	ini_set('memory_limit','512M');
	ini_set('max_execution_time', 600);
	set_time_limit(0);
	error_reporting(E_ALL);
	ini_set('display_errors',1);
	ignore_user_abort(true);

Dennoch bricht der Vorgang ab. Wiederhole ich das 2-3 mal, ist alles okay. Irgendwann hat er dann alle Dateien gelöscht bzw. schafft es vor dem Timeout. Was kann ich tun?

Danke euch!

MasterDS
 
Naja, letztendlich gibt es da nur eine Möglichkeit...
Zeig uns dein Skript und wir können versuchen es gemeinsam zu optimieren.

Die Alternative wäre halt statt mit PHP zu löschen einen Befehl an die Konsole abzusetzen und dort zu löschen... Das wäre wahrscheinlich die performanteste Alternative.
 
Wenn auf dem Server schon Safemode aktiv ist, kann er seine Ini-Patcherei eh vergessen ;)

PHP:
if (!ini_get('safe_mode'))
{
	@set_time_limit(600);
}
 
Hallo!

Also laut phpinfo() ist der save_mode OFF. Somit ist dieses Statement in meinem Skript überflüssig, aber das setzten der Ausführungszeit müsste gehen oder?

MasterDS
 
Naja, letztendlich gibt es da nur eine Möglichkeit...
Zeig uns dein Skript und wir können versuchen es gemeinsam zu optimieren.

Die Alternative wäre halt statt mit PHP zu löschen einen Befehl an die Konsole abzusetzen und dort zu löschen... Das wäre wahrscheinlich die performanteste Alternative.
Genau. alles Andere sind Pflästerchen auf ein Problem. Erst wenn die Performanceverbesserungen nicht fruchten sollte man an Serverumstellungen denken.
 
Hier die Funktion, welche die Dateien und Verzeichnisse löscht.

Code:
function rec_rmdir ($path) {
    // schau' nach, ob das ueberhaupt ein Verzeichnis ist
    if (!is_dir ($path)) {
        return -1;
    }
    // oeffne das Verzeichnis
    $dir = @opendir ($path);
    
    // Fehler?
    if (!$dir) {
        return -2;
    }
    
    // gehe durch das Verzeichnis
    while (($entry = @readdir($dir)) !== false) {
        // wenn der Eintrag das aktuelle Verzeichnis oder das Elternverzeichnis
        // ist, ignoriere es
        if ($entry == '.' || $entry == '..') continue;
        // wenn der Eintrag ein Verzeichnis ist, dann 
        if (is_dir ($path.'/'.$entry)) {
            // rufe mich selbst auf
            $res = rec_rmdir ($path.'/'.$entry);
            // wenn ein Fehler aufgetreten ist
            if ($res == -1) { // dies duerfte gar nicht passieren
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // normalen Fehler melden
            } else if ($res == -2) { // Fehler?
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // Fehler weitergeben
            } else if ($res == -3) { // nicht unterstuetzer Dateityp?
                @closedir ($dir); // Verzeichnis schliessen
                return -3; // Fehler weitergeben
            } else if ($res != 0) { // das duerfe auch nicht passieren...
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // Fehler zurueck
            }
        } else if (is_file ($path.'/'.$entry) || is_link ($path.'/'.$entry)) {
            // ansonsten loesche diese Datei / diesen Link
            $res = @unlink ($path.'/'.$entry);
            // Fehler?
            if (!$res) {
                @closedir ($dir); // Verzeichnis schliessen
                return -2; // melde ihn
            }
        } else {
            // ein nicht unterstuetzer Dateityp
            @closedir ($dir); // Verzeichnis schliessen
            return -3; // tut mir schrecklich leid...
        }
    }
    
    // schliesse nun das Verzeichnis
    @closedir ($dir);
    
    
    // alles ok
    return 0;
}
 
Zurück