Erstellen von Ordnern auf Basis von ID's / Beachtung der Performance

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Erstellen von Ordnern auf Basis von ID's / Beachtung der Performance

    Hallo zusammen,

    mit meinem ersten Post möchte ich gleich mal ein Brainstorming starten, das mich seit ein paar Tagen beschäftigt. Folgende Situation liegt vor:

    - Nutzer können Fotos hochladen
    - jedes Foto wird mit fortlaufender ID in der Datenbank festgehalten
    - jedes Foto besitzt 3 Versionen (normal, mittel, klein)

    Aufgrund der Menge der zu erwarteten Fotos speichere ich 1000 Fotos (3000 Dateien) in einen Ordner.

    Jetzt kommt meine Frage bzw. mein Problem, mit dem ich das Brainstorming anregen will:

    Da ich im vorneherein nicht weiss wieviele Fotos in einem bestimmten Zeitpunkt hochgeladen werden, kann ich die Ordner auch nicht im voraus erstellen. Momentan prüfe ich bei jedem Upload (und dem entsprechenden Datenbankeintrag), ob der jeweilige Ordner vorhanden ist. Jetzt kann ich schlecht beurteilen in wiefern eine Funktion wie "is_dir()" den Server beansprucht, wenn mehrere 100 Fotos paralell hochgeladen werden. Gleichzeitig kann ich mich allerdings auch nicht auf eine einmalige Berechnung a la
    PHP-Code:
    $photo_id 4000;
    $result $photo_id/1000;
    $create_dir = (is_int($result)) ? TRUE FALSE// Liefere mir nur TRUE wenn die Berechnung eine ganze Zahl ergibt 
    verlassen, da es bei einer ID von z.B. 4000 auch mal zu unerwarteten Problemen kommen kann, und danach dann kein entsprechendes Ergebnis zum Erstellen des Ordners vorliegt.

    Wie würdet Ihr dieses Problem lösen? Verursacht "is_dir()" Performanceprobleme (clearstatcache(); wird natürlich ausgeführt)? Gibt es eine Alternative zum vorherigen Erstellen von Ordnern? Any Ideas?

    Grüße,
    Marvin

  • #2
    Re: Erstellen von Ordnern auf Basis von ID's / Beachtung der Performance

    Original geschrieben von maRv
    (...)Da ich im vorneherein nicht weiss wieviele Fotos in einem bestimmten Zeitpunkt hochgeladen werden, kann ich die Ordner auch nicht im voraus erstellen.
    Im "Voraus" nicht, aber immer dann, wenn deine hochgezählte ID einen neuen Tausender-Gipfel erklommen hat. Das reicht doch aus.

    Momentan prüfe ich bei jedem Upload (und dem entsprechenden Datenbankeintrag), ob der jeweilige Ordner vorhanden ist.
    Wenn du auf "Nummer sicher" gehen willst, musst du natürlich das Vorhandensein des Zielordners bei jedem erfolgreichen Upload prüfen. Prinzipiell kannst du das aber auch lassen und nur im Falle eines Fehlschlags beim Datei-Verschieben im Nachhinein is_dir() benutzen, um zu einer aussagekräftigeren Fehlermeldung zu kommen.

    Jetzt kann ich schlecht beurteilen in wiefern eine Funktion wie "is_dir()" den Server beansprucht, wenn mehrere 100 Fotos paralell hochgeladen werden.
    Sie "belastet" das Filesystem. Für den WebServer selbst (oder das Server-Modul) ist das nur ein gewöhlicher Funktionsaufruf. Prinzipiell müsste is_dir() nicht mehr "Last" erzeugen, als bspw. include() oder jede andere Funktion, die das Vorhandensein eines Filesystem-Eintrages prüft.

    Gleichzeitig kann ich mich allerdings auch nicht auf eine einmalige Berechnung a la
    (...) verlassen, da es bei einer ID von z.B. 4000 auch mal zu unerwarteten Problemen kommen kann, ...
    Welche denn?
    ... und danach dann kein entsprechendes Ergebnis zum Erstellen des Ordners vorliegt.
    Für Fälle, in denen keine Ordner mehr erzeugt werden können, kannst du ja ein "globales Flag" anlegen, das vor dem Start eines jeden Uploads abgefragt wird. Wenn keine Ordner erstellt werden können oder der passende Ordner nicht vorhanden ist musst du dann Uploads generell deaktivieren.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


    • #3
      Re: Re: Erstellen von Ordnern auf Basis von ID's / Beachtung der Performance

      Wenn du auf "Nummer sicher" gehen willst, musst du natürlich das Vorhandensein des Zielordners bei jedem erfolgreichen Upload prüfen. Prinzipiell kannst du das aber auch lassen und nur im Falle eines Fehlschlags beim Datei-Verschieben im Nachhinein is_dir() benutzen, um zu einer aussagekräftigeren Fehlermeldung zu kommen.
      Diesen Weg werde ich nehmen. Ist am einfachsten. Dabei einfach die Performance im Auge behalten und draus lernen.


      Welche denn?
      Mhmm, keine Ahnung ^^ Verweis auf Murphy

      Danke für Deine Gedanken

      Kommentar


      • #4
        Ich schieb mal noch was hinterher:

        Ich hab mal ein wenig die Geschwindigkeiten getestet.

        Für den Fall, dass das Verzeichnis existiert:

        is_dir() ohne clearstatcache() ist ca. 100 mal schneller als mit. Nützt dir natürlich nichts, wenn du es nur einmal pro Script aufrufst.

        Das Verzeichnis existiert noch nicht:
        Hier ist es wurst: Beide Varianten sind gleich schnell.

        Es geht auch anders:
        @mkdir() ist schneller als is_dir(). Also könntest du bei jedem Upload einfach mkdir() (mit dem lustigen @-Operator vorne dran) aufrufen. Ob das jetzt die feine englische Art ist, weiß ich nicht, aber du fragtest ja nach Performance-Optimierungen. ;-)

        Hier mal die Ergebnisse für ein existierendes Verzeichnis:
        Code:
        performed 10000 runs == 20 loops * 500 runs_per_loop
        --
        0.099 ms   10087/s  (all: 991.328 ms) -- clear_sc.() + is_dir()
        0.106 ms    9397/s (all: 1064.123 ms) -- clear_sc.() + @is_dir()
        0.074 ms   13546/s  (all: 738.175 ms) -- @mkdir()
        0.001 ms 1308226/s    (all: 7.644 ms) -- is_dir()
        0.003 ms  391526/s   (all: 25.541 ms) -- @is_dir()
        0.097 ms   10261/s  (all: 974.533 ms) -- clear_sc.() + file_exists()
        0.098 ms   10202/s  (all: 980.153 ms) -- clear_sc.() + is_writable()
        --
        sysinfo:
        php_version: 5.2.6
        zend_version: 2.2.0
        phpos: WINNT
        uname_os: Windows NT 5.1 build 2600
        cpu: i586 (intel|vax byte order)
        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

        Kommentar


        • #5
          Interessant. Bis vor kurzem habe ich clearstatcache keine Beachtung geschenkt. Dann habe ich es implementiert. Und jetzt ist es langsamer.. Mhmm.. man lernt nie aus

          Sobald ich meinen Weg gefunden habe, werde ich mich hier mit meiner Lösung melden. Kann etwas dauern, da momentan sehr beschäftigt.

          Kommentar

          Lädt...
          X