Ankündigung

Einklappen
Keine Ankündigung bisher.

Php performance

Einklappen

Neue Werbung 2019

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

  • Php performance

    Hallo liebe Community,

    ich wollte fragen was performance mässig besser wäre.
    Man stellt sich vor eine Community mit 20 000 Usern. Jeder User kann bis zu 5 Dateien hochladen. Ist es besser alle 20000*5 Dateien in einem Ordner zu Speichern oder für jeden User ein Ordner anzulegen ?

  • #2
    Zitat von d4rk Beitrag anzeigen
    Ist es besser alle 20000*5 Dateien in einem Ordner zu Speichern oder für jeden User ein Ordner anzulegen ?
    Weder noch.

    Das Auslesen von Verzeichnissen oder auch nur finden von Dateien in diesen wird ab einer bestimmten Anzahl von Verzeichniseinträgen unperformant. (Natürlich in unterschiedlichem Maße, abhängig vom verwendeten Dateisystem.)


    Man kann sich bspw. überlegen, die Dateien nach Anfangsbuchstaben in gleichnamige Verzeichnisse zu legen. Und das ggf. nicht nur über eine, sondern zwei oder noch mehr Ebenen.

    Wenn eine Gleichverteilung der Dateinamen nicht zu erwarten ist oder nicht anderweitig sichergestellt werden kann - dann könnte man auch noch die Ergebnisse von Hash-Funktionen wie MD5 oder SHA-1 zu Umbenennung der Dateien heranziehen.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Also schlägst du vor den Datei namen zu ändern mit einer Hash-Funktionen und dann die Datei im Ordner e4r5 zu speichern zum beispiel ?

      Kommentar


      • #4
        Ein Verzeichnis der Dateien via Datenbank ?

        Ist das ganze konsistent und es löscht niemand via Console/FTP o.ä. (was aber auch im Script abgefangen werden kann), ist dies denke ich die permormanteste Lösung.

        Kommentar


        • #5
          wie meinst du das ? die Adresse wo das bild liegt zu speichern ?

          Kommentar


          • #6
            Name, Pfad, datum wann es hochgeladen wurde, von wem.. original name, typ, eine ID zum eindeutigen Zuordnen...
            dann kannst du auch leicht kommentare dazu realisieren

            Kommentar


            • #7
              Hmm, meine Erfahrung ist da anders. Ich speicher bei einem grossen Community Projekt die Informationen zur Nachricht in der DB (von, an, betreff, date etc), die ID des Eintrags ist dann automatisch der Dateiname mit dem Inhalt der Nachricht.

              Diese lege ich alle in einem Verzeichnis (ext4 Dateisystem) ab, zur Zeit sind es ca. 150.000 kleine TXT Dateien pro Tag. Ich merke da keine Nachteile der Geschwindigkeit, aufgrund der Größe und Länge der Nachrichten ist es schneller als vorher aus der Datenbank.

              Man muß das natürlich sauber und logisch programmieren.
              Gruß Werner
              Mein kleines Projekt: Fussball Satrup
              Wird ein OpenSource CMS für Fussballvereine

              Kommentar


              • #8
                liegen denn die 150.000 Txt datein in einem ordner ?

                Kommentar


                • #9
                  Ja, es liegen alle Nachrichten des aktuellen Tages in einem Verzeichnis
                  Gruß Werner
                  Mein kleines Projekt: Fussball Satrup
                  Wird ein OpenSource CMS für Fussballvereine

                  Kommentar


                  • #10
                    Würde stark zur Hashmethode neigen. Was spricht dagegen? Alle Dateien in einem Ordner machen die manuelle Bearbeitung praktisch unmöglich, die braucht man wahrscheinlich nie, aber falls doch mal - bei mir ist damals das FTP-Programm abgestürzt.

                    Ich würde das so aufbauen, dass du ein 1+1+1-Prefix benutzt, das durch eine Datenbanktabelle indiziert ist:

                    Etwa so:
                    Hash: md5(md5_file($filename) . uniqid()); (ich würde gleiche Dateien der Einfachheit trotzdem mehrfach anlegen)
                    Dateipfad: a/c/d/abcdef0123456789.[Endung]

                    Datenbank:
                    Filebase
                    id | hash | file_name | file_extension | mime_type | file_size | md5_file | created

                    Und deine User-Dateien kannst du dann einfach mit einem Link drauf machen:
                    user_images
                    id | user_id | filebase_id

                    Meiner Meinung nach die Vorteile:

                    - relativ beliebig viele Dateien möglich
                    - skalierbar, weil du auch mit einer Million Dateien umgehen könntest (musst halt neue Ordnerebenen reinziehen)
                    - auch manuell noch Zugriff ohne Probleme möglich
                    - in der Datenbank stehen alle Informationen, die dir beim Anlegen der Datei bekannt waren (siehe $_FILES)
                    - selbst wenn du die Datenbank verlierst, hast du mit der Dateiendung noch eine ungefähre Info, was das für eine Datei ist
                    - dein "Modul" für die Dateiverwaltung beschränkt sich nicht auf die Benutzer und ihre Profilbilder (oder was du damit machen willst), sondern du kannst es für alles mögliche benutzen.
                    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                    Kommentar


                    • #11
                      Ich würde das genauso wie Chris machen, würde auch zu verschiedenen Ordnerebenen tendieren, da sonst die Dateizugriffe langsamer sein könnten, wenn meherere 10Tausende Dateien im selben Verzeichnis liegen.
                      "My software never has bugs, it just develops random features."
                      "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                      Kommentar


                      • #12
                        Je nach Anwendungszweck gibt es viele Möglichkeiten. Ich würde bei zufälligen Daten auch auf die Variante die Chriz nutzt zurück greifen.

                        In einem Projekt von mir werden pro Tag rund 20 Events mit je 150 Fotos hochgeladen. Bei mir sieht die Ordnerstruktur dann so aus:

                        /Jahr/Monat/Tag/EventID/*.jpg

                        Bsp:
                        /2010/05/27/53214/Spielwiese_001.jpg

                        Somit hab ich pro Ordner maximal 400 Fotos, pro Tag auch eine begrenzte Anzahl, im Monat höchstens 31 Ordner und im Jahr 365. Außerdem macht die Aufteilung deutlich mehr Sinn als nach einem Hash.

                        Kommentar

                        Lädt...
                        X