datenbankler: Uploadverzeichniss clever verwalten.

Hallo ich brauche mal ein bißchen kreatives Denken.
Ich habe auf meinem Server mehrere Uploadverzeichnisse in denen insgesammt so 100.000 Bilddateien liegen.
Bisher ist es so das ich nach 12 Monaten, nach Uploaddatum,  die Bilder einfach lösche.
Nun das hat sich als nicht sehr effektiv erwiesen. Manche Bilder wurden nur Testweise hochgeladen und werden nie angeschaut, andere sind rege in gebrauch und lösen Empörung aus wenn die auf einmal weg sind.

Ich bin auf der suche nach einer cleveren Lösung, ich stelle mir vor das (wie bei Rapidshare) die Datei nach einer gewissen Zeit gelöscht wird wenn kein Zugriff erfolgt ist.

Jetzt stehe ich vor mehreren Problemen, wie kann ich per FTP mit das letzte Zugiffsdatum anschauen, damit ich abschätzen kann was die Sache eigentlich bringt.

Und wie zuverlässig ist die ganze Sache, wenn mein Provider ein Backup macht, dann sind ja alle Dateien angetouched, oder?

So richtig sicher bin ich mir bei der Sache nicht, ich bin für andere Vorschläge jederzeit offen.

Vielen Dank fürs mithirnen.

Achja eine Lösung per PHP und Cronjob wäre mir am liebsten.

Grüße

Datenbankler

  1. Hi,

    Ich bin auf der suche nach einer cleveren Lösung, ich stelle mir vor das (wie bei Rapidshare) die Datei nach einer gewissen Zeit gelöscht wird wenn kein Zugriff erfolgt ist.

    also brauchst du eine Möglichkeit, das Zugriffsdatum zu protokollieren. Oder vielleicht auch nicht, denn so ein Protokoll existiert mit an Sicherheit grenzender Wahrscheinlichkeit schon: Das Access Log des Webservers.
    Du brauchst also bloß mit einem Script das Access Log durchzugehen und zu jedem der Bilder das letzte (jüngste) Zugriffsdatum ermitteln.

    Jetzt stehe ich vor mehreren Problemen, wie kann ich per FTP mit das letzte Zugiffsdatum anschauen

    Wieso per FTP? Das wäre doch irgendwie von hinten durch die Brust ins Knie.

    Und wie zuverlässig ist die ganze Sache, wenn mein Provider ein Backup macht, dann sind ja alle Dateien angetouched, oder?

    Aber das ist kein HTTP-Zugriff, der Webserver macht also einen Eintrag ins Protokoll.

    So richtig sicher bin ich mir bei der Sache nicht, ich bin für andere Vorschläge jederzeit offen.

    Eine andere Möglichkeit wäre noch, den direkten HTTP-Zugriff auf die Bilder zu verhindern und alle Bilder nur über ein PHP-Script auszuliefern. Dieses Script würde dann in einer Datenbank zu jedem ausgelieferten Bild einen Timestamp vermerken.

    So long,
     Martin

    --
    Finanztipp:
    Leihen Sie sich Geld von einem Pessimisten.
    Er rechnet sowieso nicht damit, dass er es zurückbekommt.
    1. Hello,

      also brauchst du eine Möglichkeit, das Zugriffsdatum zu protokollieren. Oder vielleicht auch nicht, denn so ein Protokoll existiert mit an Sicherheit grenzender Wahrscheinlichkeit schon: Das Access Log des Webservers.

      Oder auf einem Linux Host, die Access-Time auf das File, sofern sie verwaltet wird. Sie wird leider von vielen Serverbetreibern ausgeschaltet in den Mount-Vorgaben, da sie (zugegeben) Performance des Filesystems kostet.

      http://de2.php.net/manual/de/function.fileatime.php

      Um diese Zeit sinnvoll auszuwerten, benötigt man allerdings einen Konsolenzugang zum System oder zumindest das Recht für die Exec()-Funktion von PHP.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. Hi,

      Ich bin auf der suche nach einer cleveren Lösung, ich stelle mir vor das (wie bei Rapidshare) die Datei nach einer gewissen Zeit gelöscht wird wenn kein Zugriff erfolgt ist.

      also brauchst du eine Möglichkeit, das Zugriffsdatum zu protokollieren. Oder vielleicht auch nicht, denn so ein Protokoll existiert mit an Sicherheit grenzender Wahrscheinlichkeit schon: Das Access Log des Webservers.

      Ja, ok. Ein Log gibt es, das ist gepackt als *.gz und hat entpackt 400.000 Zeilen. Wenn ich jetzt z.B schauen möchte ob in den letzten 3 Monate ein Zugriff stattgefunden hat müßte ich 90 Logs entpacken und auswerten?!? Das wäre ja oberkrass, ich glaube da würde ich einen Timeout reinlaufen.
      Möglich wäre, dass ich tatsächlich alle Bilder in einer DB protokolliere, indem ich täglich das aktuellste Log auswerte. Aber das wäre ja auch heftig, bei meinem Projekt muss ich damit rechnen das die ganze Sache in den nächsten 3 Jahren nochmal um das 10fache wächst.
      Dann hätte die DB eine Million Einträge, ist das ein Problem? Da muss es doch was einfacheres geben.

      Du brauchst also bloß mit einem Script das Access Log durchzugehen und zu jedem der Bilder das letzte (jüngste) Zugriffsdatum ermitteln.

      Jetzt stehe ich vor mehreren Problemen, wie kann ich per FTP mit das letzte Zugiffsdatum anschauen

      Wieso per FTP? Das wäre doch irgendwie von hinten durch die Brust ins Knie.

      Ich möchte mir nur mal das Datum anschauen. Einfach so aus Interesse was die Sache bringen könnte.

      Und wie zuverlässig ist die ganze Sache, wenn mein Provider ein Backup macht, dann sind ja alle Dateien angetouched, oder?

      Aber das ist kein HTTP-Zugriff, der Webserver macht also einen Eintrag ins Protokoll.

      Verstanden.

      So richtig sicher bin ich mir bei der Sache nicht, ich bin für andere Vorschläge jederzeit offen.

      Eine andere Möglichkeit wäre noch, den direkten HTTP-Zugriff auf die Bilder zu verhindern und alle Bilder nur über ein PHP-Script auszuliefern. Dieses Script würde dann in einer Datenbank zu jedem ausgelieferten Bild einen Timestamp vermerken.

      So was ähnliches mach ich schon bei einer anderen Funktion. Muß mal darüber nachdenken aber da hätte ich auch wieder die Riesendatenbank. Und jedesmal einen DB Zugriff wenn das Bild geladen wird.

      So long,
      Martin

      1. Hallo,

        also brauchst du eine Möglichkeit, das Zugriffsdatum zu protokollieren. Oder vielleicht auch nicht, denn so ein Protokoll existiert mit an Sicherheit grenzender Wahrscheinlichkeit schon: Das Access Log des Webservers.
        Ja, ok. Ein Log gibt es, das ist gepackt als *.gz und hat entpackt 400.000 Zeilen. Wenn ich jetzt z.B schauen möchte ob in den letzten 3 Monate ein Zugriff stattgefunden hat müßte ich 90 Logs entpacken und auswerten?!? Das wäre ja oberkrass, ich glaube da würde ich einen Timeout reinlaufen.

        du hast 400'000 Zugriffe am Tag? Wow!

        Möglich wäre, dass ich tatsächlich alle Bilder in einer DB protokolliere, indem ich täglich das aktuellste Log auswerte. Aber das wäre ja auch heftig, bei meinem Projekt muss ich damit rechnen das die ganze Sache in den nächsten 3 Jahren nochmal um das 10fache wächst.
        Dann hätte die DB eine Million Einträge, ist das ein Problem?

        Nö. Das sollte ein DBMS locker hinkriegen.

        Du brauchst also bloß mit einem Script das Access Log durchzugehen und zu jedem der Bilder das letzte (jüngste) Zugriffsdatum ermitteln.

        Tom schlägt vor, die "Access-Time"-Info des Filesystems auszuwerten. Das wäre allerdings ein Fehlschuss: Abgesehen von den Bedenken, die er selbst schon nennt, würde der Access-Timestamp auch aktualisiert, wenn dein Hoster ein Backup macht (das waren ja deine Bedenken).

        Wieso per FTP? Das wäre doch irgendwie von hinten durch die Brust ins Knie.
        Ich möchte mir nur mal das Datum anschauen. Einfach so aus Interesse was die Sache bringen könnte.

        Ah, gut. Soweit ich weiß, siehst du via FTP aber nur das Änderungsdatum. Das interessiert dich ja nicht so brennend.

        Ciao,
         Martin

        --
        Ich liebe Politiker auf Wahlplakaten.
        Sie sind tragbar, geräuschlos, und leicht wieder zu entfernen.
          (Loriot, deutscher Satiriker)
        1. also brauchst du eine Möglichkeit, das Zugriffsdatum zu protokollieren. Oder vielleicht auch nicht, denn so ein Protokoll existiert mit an Sicherheit grenzender Wahrscheinlichkeit schon: Das Access Log des Webservers.
          Ja, ok. Ein Log gibt es, das ist gepackt als *.gz und hat entpackt 400.000 Zeilen. Wenn ich jetzt z.B schauen möchte ob in den letzten 3 Monate ein Zugriff stattgefunden hat müßte ich 90 Logs entpacken und auswerten?!? Das wäre ja oberkrass, ich glaube da würde ich einen Timeout reinlaufen.

          du hast 400'000 Zugriffe am Tag? Wow!

          Ja, leider. Das macht die ganze Sache nicht so einfach.
          So sieht eine Zeile in der Log aus:
          93.209.245.23 - - [20/Feb/2010:23:25:17 +0100] "GET /upload/10/3926-121-ODA-=-12-11538.jpg HTTP/1.1" 404 224 "http://beispiel.html" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8"
          Mein erster Gedanke:
          Zeilenweise auslesen, und mit explode() dem String auftrennen und in Array speichern und weiterverarbeiten. Nun hätte ich eine Menge Müll in dem Array den ich nicht brauche. Weißt du was besseres, wäre nett schlecht wenn ich den Rest der Zeile nach dem x-ten Leerzeichen unverarbeitet verwerfen könnte.

          1. Hallo,

            So sieht eine Zeile in der Log aus:

            das ist mir schon in etwa klar.

            Zeilenweise auslesen, und mit explode() dem String auftrennen und in Array speichern und weiterverarbeiten. Nun hätte ich eine Menge Müll in dem Array den ich nicht brauche.

            Nicht unbedingt.

            Weißt du was besseres, wäre nett schlecht wenn ich den Rest der Zeile nach dem x-ten Leerzeichen unverarbeitet verwerfen könnte.

            Du kennst den Aufbau deiner Logfiles, du weißt, welche Information an welcher Stelle steht. Du brauchst aber nur den Timestamp und die angeforderte Ressource (und selbst das nur, wenn es sich um eines der Bilder handelt). Also lass den Rest einfach unterwegs fallen.

            Ciao,
             Martin

            --
            Das einzige Problem beim Nichtstun: Man weiß nie, wann man damit fertig ist.
          2. Hello,

            Mein erster Gedanke:
            Zeilenweise auslesen, und mit explode() dem String auftrennen und in Array speichern und weiterverarbeiten. Nun hätte ich eine Menge Müll in dem Array den ich nicht brauche. Weißt du was besseres, wäre nett schlecht wenn ich den Rest der Zeile nach dem x-ten Leerzeichen unverarbeitet verwerfen könnte.

            Es ist einfacher, wenn man für das Aufspalten der Logzeile die PHP-Funktion fgetcsv() benutzt.
            Als Feldtrenner ist dann i.d.R. das Leerzeichen zu verwenden und als Feldbegrenzer das Doppelhäkchen.
            Damit bekommt man schon eine sehr saubere Trennung hin. Einige Elemente muss man dann ggf. wieder zusammenfügen.

            Und lesen muss man das Log ja sowieso zeilenweise. Es wird kaum noch komplett in den Arbeitsspeicher von PHP passen.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de