Bilder nach gewisser Zeit automatisch vom Server löschen?
veritas
- php
0 bleicher0 Auge
0 Christoph Jeschke0 Auge0 veritas0 Christoph Jeschke0 Auge
Hallo,
Ich habe ein kleines Bild Hosting Script in PHP geschrieben das ohne MySQL DB auskommt. Nun möchte ich versuchen die Bilder die nicht mehr aufgerufen werden so nach z.B. 1 Jahr automatisch wieder zu löschen, um halt Speichplatz zu sparen. Das sollte allerdings ohne MySQL Datenbank funktionieren, ist sowas möglich?
Ich hab mir schonmal überlegt das mit Cromjobs zu machen, allerdings weis ich nicht wie genau ich das ins Script einbinden muss bzw. welche Befehle es da gibt, oder hat jemand noch eine andere Idee wie man sowas ohne MySQL realisiern könnte?
Ich Danke schonmal im voraus!
Grüße,
veritas
Grüße,
Ich hab mir schonmal überlegt das mit Cromjobs zu machen, allerdings weis ich nicht wie genau ich das ins Script einbinden muss bzw. welche Befehle es da gibt, oder hat jemand noch eine andere Idee wie man sowas ohne MySQL realisiern könnte?
mach für jeden tag/woche/monat einen eigenen verzeichniss und lösche den samt inhalt.
MFG
bleicher
Hallo
Grüße,
Ich hab mir schonmal überlegt das mit Cromjobs zu machen, allerdings weis ich nicht wie genau ich das ins Script einbinden muss bzw. welche Befehle es da gibt, oder hat jemand noch eine andere Idee wie man sowas ohne MySQL realisiern könnte?
mach für jeden tag/woche/monat einen eigenen verzeichniss und lösche den samt inhalt.
Nene, es geht ja nicht darum, dass die Bilder ein gewisses Alter haben, sondern dass über einen definierten Zeitraum nicht mehr auf sie zugegriffen wurde.
Es muss also erstmal ein Zählwerk her. Für diesen Zweck würde es reichen, mit einem Skript bei jedem Zugriff auf jedes Bild, den Zeitpunkt dieses Zugriffs zu speichern. Nun kann man ein weiteres Skript schreiben, in welchem diese Informationen ausgelesen werden, die Infos zu allen Bildern, auf die im definierten Zeitraum nicht mehr zugegriffen wurde, eingesammelt und daraus die Pfade zu den Bildern generiert und hernach die Bilder vom Datenträger gelöscht werden. Dieses Skript, also das Letztere, lässt man dann per Cronjob aufrufen und ausführen.
Tschö, Auge
Guten Tag,
Hallo,
Ich habe ein kleines Bild Hosting Script in PHP geschrieben das ohne MySQL
DB auskommt. Nun möchte ich versuchen die Bilder die nicht mehr aufgerufen
werden so nach z.B. 1 Jahr automatisch wieder zu löschen, um halt
Speichplatz zu sparen. Das sollte allerdings ohne MySQL Datenbank
funktionieren, ist sowas möglich?
Ja. Du erhältst den Timestamp des letzten Dateizugriffs mit Hilfe von fileatime(), (Hinweise dort beachten). Du kannst nun über alle Dateien iterieren, die fileatime prüfen und die Datei löschen, wenn eine bestimmte Zeit vergangen ist. Das ist der unperformante und umständliche weg.
Ich hab mir schonmal überlegt das mit Cromjobs zu machen, allerdings weis
ich nicht wie genau ich das ins Script einbinden muss bzw. welche Befehle
es da gibt,
man cron
man crontab
man find
man xargs
man rm
Gruß
Christoph Jeschke
Hallo
Ja. Du erhältst den Timestamp des letzten Dateizugriffs mit Hilfe von fileatime(), (Hinweise dort beachten). Du kannst nun über alle Dateien iterieren, die fileatime prüfen und die Datei löschen, wenn eine bestimmte Zeit vergangen ist. Das ist der unperformante und umständliche weg.
Was meinst du konkret mit "unperformant und umständlich"? Die Info ist da (bis auf die in der Doku genannten Ausnahmen) und über alle (relevanten) Dateien muss doch sowieso geprüft werden (Schleife).
Schlussendlich sollte das alles in allem immer noch performanter sein, als mein Ansatz, die entsprechenden Werte noch einmal extra zu speichern und dann von dort zu prüfen.
Tschö, Auge
Hi,
Erstmal danke für die Antworten :)
Wenn ich euch jetzt richtig verstanden habe hat PHP also sogar schon einen eigenen Befehl für die letzten Dateizugriffe, heißt das das ich quasi nur eine Textdatei brauche in der ich das Datum des letzten Aufrufes der Bilder speichere und diese dann mit "int fileatime ( string $filename )" irgendwie auslesen kann? Denn Befehl kenne ich leider nicht :/
Das läuft zurzeit so bei mir, wenn ein Bild hochgeladen wird wird dieses halt einmal im Original abgelegt und es wird ein Thumbnail erstellt, die Bildinformationen werden dann in eine Textdatei geschrieben (im Detail wird der Aufruf (Hits) und der Name des Bildes dort gespeichert). Jetzt muss ich ja noch irgendwie das Datum da gespeichert bekommen, wann halt das Bild zuletzt aufgerufen wurde, richtig? Und dann kann ich erst diese "int fileatime ( string $filename )" Funktion benutzten, oder?
Das klingt ja erstmal garnicht so schwer :) Ich würd ja auch mal mein Script hier posten, aber das soll nicht jeder sehen weil ich schon ne Menge Arbeit reingesteckt hab. ich werd jetzt erstmal so versuchen, mal sehen ob ich so was hinbekomme.
Gruß,
veritas
P.S. Wenn ihr mal paar Ansätze habt wäre natürlich auch nich schlecht, ist dann immer etwas einfacher für mich ^^
Hi,
Das läuft zurzeit so bei mir, wenn ein Bild hochgeladen wird wird dieses halt einmal im Original abgelegt und es wird ein Thumbnail erstellt, die Bildinformationen werden dann in eine Textdatei geschrieben (im Detail wird der Aufruf (Hits) und der Name des Bildes dort gespeichert). Jetzt muss ich ja noch irgendwie das Datum da gespeichert bekommen, wann halt das Bild zuletzt aufgerufen wurde, richtig? Und dann kann ich erst diese "int fileatime ( string $filename )" Funktion benutzten, oder?
Nein.
fileatime liefert dir automatisch den Zeitpunkt, zu dem der letzte Zugriff auf eine Datei stattgefunden hat.
Allerdings muss das System das auch unterstuetzen - Windows tut das m.W. nicht, und auch unter Linux-Systemen kann das aus Performancegruenden abgestellt sein, wie das Manual zu fileatime beschreibt.
MfG ChrisB
Guten Tag,
Allerdings muss das System das auch unterstuetzen - Windows tut das m.W.
nicht, [...]
Hängt vom verwendeten Dateisystem ab, wie auch in den UCN dort beschrieben.
Gruß
Christoph Jeschke
Guten Tag,
Wenn ich euch jetzt richtig verstanden habe hat PHP also sogar schon
einen eigenen Befehl für die letzten Dateizugriffe, heißt das das ich
quasi nur eine Textdatei brauche in der ich das Datum des letzten
Aufrufes der Bilder speichere und diese dann mit "int fileatime ( string
$filename )" irgendwie auslesen kann? Denn Befehl kenne ich leider nicht
:/
Nein. Diese Metainformation (atime, access time) speichert das Filesystem deines geringsten Misstrauens für dich. fileatime() bezieht diese Information von dort und liefert dir einen sog. Unix Timestamp (vergangene Sekunden seit der Epoche). Mit diesem kannst du rechnen, bzw. diesen kannst mit geeigneten Funktionen als Ausgangbasis für eine Rechnung verwenden. Du brauchst diese Informationen nicht(!) selbst bevorraten.
Du musst dich letztlich nur darum kümmern, dass diese Informationen ausgelesen werden und ein Programm auf Basis dieser Informationen eine Entscheidung trifft: Löschen oder behalten?
Das läuft zurzeit so bei mir, wenn ein Bild hochgeladen wird wird dieses
halt einmal im Original abgelegt und es wird ein Thumbnail erstellt, die
Bildinformationen werden dann in eine Textdatei geschrieben (im Detail
wird der Aufruf (Hits) und der Name des Bildes dort gespeichert).
Das ist kludge.
Jetzt
muss ich ja noch irgendwie das Datum da gespeichert bekommen, wann halt
das Bild zuletzt aufgerufen wurde, richtig? Und dann kann ich erst diese
"int fileatime ( string $filename )" Funktion benutzten, oder?
Ja, aber nicht auf die Art, die du hier beschreibst.
Das klingt ja erstmal garnicht so schwer :) Ich würd ja auch mal mein
Script hier posten, aber das soll nicht jeder sehen weil ich schon ne
Menge Arbeit reingesteckt hab. ich werd jetzt erstmal so versuchen, mal
sehen ob ich so was hinbekomme.
Das ist vielleicht sogar besser so.
P.S. Wenn ihr mal paar Ansätze habt wäre natürlich auch nich schlecht,
ist dann immer etwas einfacher für mich ^^
Der Ansatz ist ganz einfach: Du liest die in meiner ersten Antwort angegebenen Manpages und wirst feststellen, dass es genau eines Einzeilers auf der Kommanozeile bedarf, der leicht automatisiert aufgerufen werden kann. Und schon bist du dein Problem los.
Gruß
Christoph Jeschke
Guten Tag,
Was meinst du konkret mit "unperformant und umständlich"? Die Info ist da
(bis auf die in der Doku genannten Ausnahmen) und über alle (relevanten)
Dateien muss doch sowieso geprüft werden (Schleife).
find in Kombination mit xargs und rm ist wesentlich einfacher und gerade bei großen Dateibeständen (wir müssen ja jede Datei prüfen!) deutlich schneller als eine Implementierung in PHP.
Schlussendlich sollte das alles in allem immer noch performanter sein, als mein Ansatz,
die entsprechenden Werte noch einmal extra zu speichern und dann von dort
zu prüfen.
Nur weil mein Vorschlag nicht gut war, bedeutet es ja nicht, dass es nicht noch schlechtere gibt. Eine noch schlechtere Idee wäre es, z.B. einen Logfile-Filter zu bauen, der einerseits alle relevanten Dateien kennt und andererseits für jede eine persistente Zugriffshistorie führt, die er auf Basis der Accesslogs pflegt. Wenn ich genau darüber nachdenke, hat Auge sowas ähnliches vorgeschlagen. Verrückte Welt.
Gruß
Christoph Jeschke
Hallo
Was meinst du konkret mit "unperformant und umständlich"? Die Info ist da
(bis auf die in der Doku genannten Ausnahmen) und über alle (relevanten)
Dateien muss doch sowieso geprüft werden (Schleife).find in Kombination mit xargs und rm ist wesentlich einfacher und gerade bei großen Dateibeständen (wir müssen ja jede Datei prüfen!) deutlich schneller als eine Implementierung in PHP.
Ahh, da geht die Reise hin. :-)
Bleibt das Problem, ob man diese Möglichkeit nutzen kann.
Schlussendlich sollte das alles in allem immer noch performanter sein, als mein Ansatz, ...
Nur weil mein Vorschlag nicht gut war, bedeutet es ja nicht, dass es nicht noch schlechtere gibt. Eine noch schlechtere Idee wäre es, z.B. einen Logfile-Filter zu bauen, der einerseits alle relevanten Dateien kennt und andererseits für jede eine persistente Zugriffshistorie führt, die er auf Basis der Accesslogs pflegt. Wenn ich genau darüber nachdenke, hat Auge sowas ähnliches vorgeschlagen. Verrückte Welt.
Ja, hat er.
Schon komisch, in der dritten Person angesprochen zu werden. :-)
Tschö, Auge