2016-06-04 11 views
3

Ich habe rund 600k Bilder in einem Verzeichnis, und ich muss fast die Hälfte von ihnen mit PHP löschen. In einem Array habe ich Namen von Dateien gespeichert, die gelöscht werden müssen, und wenn ich versuche, Array durchzulaufen und unlink($filename)Server abstürzt nach ~ 1k Iterationen und ich muss es neu starten (CentOS 7). PHP Speicherverbrauch ist 81MB, und das ist wegen der großen Array, die ich verwendet habe, weil es für einige Vergleiche gegen Dateien im Verzeichnis schneller ist, nicht wichtig.PHP unlink große Anzahl von Dateien

foreach($filenames as $filename){ 

    // Deletes file 
    unlink($filename); 
} 

I tought, vielleicht i exec() versuchen sollte, aber es ist sehr langsam, und nach einiger Zeit auch es friert. Ich habe auch eine discussion hier über es ist unlink() asynchron gesehen, aber ich denke, es ist nicht.

Ich brauche nicht rmdir() und Löschen von Verzeichnissen, weil alle 600k Dateien in einem Verzeichnis sind, und die Beziehung zwischen Dateien und Entitäten in der Anwendung sind in der DB gespeichert.

Gibt es eine andere Alternative, um Dateien aus PHP zu löschen, oder einen Ratschlag, wie man dieses Ding zum Laufen bringt?

+0

Führen Sie dies über einen Browser aus? Oder von der Kommandozeile? Wenn Sie etwas ausführen, das eine lange Ausführungszeit benötigt, sollten Sie es nicht über einen Browser ausführen. –

+0

Von der CLI aus natürlich –

+0

Warum muss dies von PHP aus erfolgen? – Doug

Antwort

0

Ich habe eine Lösung gefunden. Erste Schreibliste aller Dateien in to_delete.txt Datei (ein Dateiname pro Zeile) mit file_put_contents(). Dann starte xargs -a to_delete.txt -d'\n' rm, um Dateien zu löschen (xarg fügt so viele Argumente wie möglich zu rm hinzu, es führt nicht den rm-Befehl für jede Datei aus).

Verwandte Themen