Marko: Ist es sinnvoll, Bilder in der Datenbank zu speichern?

Hallo,

Ich schreibe gerade einen Webshop, bei dem alle Produktbilder bisher in einem Ordner gespeichert werden.

Das geht soweit ganz gut, aber das Problem eröffnet sich mir beim schreiben des Administrationstools. Denn das Tool muss nicht nur lokal die Daten ändern, sondern natürlich auch Remote. Bei den Datenbankeinträgen ist es ja kein Problem, aber bei den Bildern ist es mir irgendwie zu mühsam, extra einen FTP-Account einzurichten, ständig die Ordnerliste runterzuladen, und die Bilddateien aufladen.

Deshalb erscheint es mir viel praktischer, die Bilder in einer Mysqltabelle zu lagern (eine Tabelle ausschliesslich für Bilder + eine auto_increment Spalte).

Die Bilder sind belibig gross, aber in der Regel ca. 400-800kb gross, die Anzahl Bilder ist ebenfalls belibig, aber wahrscheinlich nicht höher als 3000.

Ist es ein riesiges Performance-Problem oder kann ich das so machen?
Was empfehlt ihr mir sonst?

Danke & Liebe Grüsse,

Marko

  1. Hi,

    einen kleinen Überblick gibts in der PHP-FAQ

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. Hi Marko,

    Ist es ein riesiges Performance-Problem oder kann ich das so machen?
    Was empfehlt ihr mir sonst?

    Den entsprechenden Artikel aus der PHP FAQ kennst du wohl, oder?

    Also ich würde die Bilder _nicht_ in der Datenbank speichern. Einerseits wären mir das zu viele Daten, man hat IMHO keine richtige Übersicht mehr und brauch zusätzliche Script zum Aufnehmen und Ausgeben der Datenbank. Was die Performance anbelangt kann ich nichts sagen, weil ich noch nie massenhaft Bilder in einer DB gespeichert habe, geschweige denn das im laufenden Betrieb einer gut besuchten Website getestet habe.

    Zu deinen Einwänden: Was spricht dagegen auf dem Server ein PHP Script zu haben, was das Bild in Empfang nimmt? Dann brauchst zu keinen FTP Upload mehr machen. Wenn du es richtig kompliziert machen willst, könntest du natürlich das Bild auch temporär in ein DB schreiben und dann mit einem Script auf dem Server die Bilder aus der temporären Datenbank regelmäßig auslesen und auf den Server schreiben ;-)

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Das Leben ist kein Warenhaus - es nimmt nichts zurück. (Anette Louisan)
    1. Hi,

      Den entsprechenden Artikel aus der PHP FAQ kennst du wohl, oder?

      Ja

      Also ich würde die Bilder _nicht_ in der Datenbank speichern. Einerseits wären mir das zu viele Daten, man hat IMHO keine richtige Übersicht mehr und brauch zusätzliche Script zum Aufnehmen und Ausgeben der Datenbank.

      Naja das soll nicht mein Problem sein, sondern eher die Sache mit der Performance.

      Zu deinen Einwänden: Was spricht dagegen auf dem Server ein PHP Script zu haben, was das Bild in Empfang nimmt?

      Diese Idee gefällt mir richtig gut. Aber wie schütze ich es dann vor Missbrauch? Und haben nicht allzuviele Provider eine Uploadbegrenzung unter 2 oder gar einem Megabyte?

      Wenn du es richtig kompliziert machen willst, könntest du natürlich das Bild auch temporär in ein DB schreiben und dann mit einem Script auf dem Server die Bilder aus der temporären Datenbank regelmäßig auslesen und auf den Server schreiben ;-)

      Was die Antwort wäre auf beide vorangehenden Fragen ;)

      Vielen Dank!

      Gruss, Marko

      1. Hi Marko,

        Zu deinen Einwänden: Was spricht dagegen auf dem Server ein PHP Script zu haben, was das Bild in Empfang nimmt?

        Diese Idee gefällt mir richtig gut. Aber wie schütze ich es dann vor Missbrauch? Und haben nicht allzuviele Provider eine Uploadbegrenzung unter 2 oder gar einem Megabyte?

        Vor Missbrauch kannst du das Script mittels einer HTTP Authentifizierung schützen - wo ist da das Problem?

        Die Uploadbegrenzung ist da i.d.R. schon ein größeres Problem. Da spielen 3 Parameter eine Rolle:

        • file_uploads: Muss auf 1 stehen, damit PHP überhaupt Dateien vom Clienten in Empfang nimmt, Grundeinstellung ist 1.
        • upload_max_filesize: Gibt die Größe an, die _eine einzelne_ hochzulandende Datei maximal haben darf, Grundeinstellung sind 2 MB.
        • post_max_size: Legt fest, wie viele Daten PHP insgesamt überhaupt per POST entgegennimmt, ist somit die Beschränkung für alle hochzuladenden Dateien zusammen, Grundeinstellung sind 8 MB.

        Diese Optionen musst du natürlich erst einmal alle prüfen, bevor du weitermachen kannst. Weiterhin solltest du prüfen, ob auf dem Server PHP als Apache Modul oder über CGI läuft. Läuft PHP über letzeres, kannst du die Runtime Configuration verwenden, mit der du die 3 Optionen oben für deine Bedürfnisse abändern kannst.

        Wenn du es richtig kompliziert machen willst, könntest du natürlich das Bild auch temporär in ein DB schreiben und dann mit einem Script auf dem Server die Bilder aus der temporären Datenbank regelmäßig auslesen und auf den Server schreiben ;-)

        Was die Antwort wäre auf beide vorangehenden Fragen ;)

        Richtig, das wäre sozusagen eine Problemlösung, wenn es dir aus technischen Gründen nicht gelingt, die Sachen über ein Formular upzuloaden - setzt allerdings vorraus, dass die Datenbank von außen abrufbar sein muss. Und wenn dir nicht gerade Cronjobs zur Verfügung stehen, mit denen du z.B. alle 10 Minuten nach neuen Bilder schauen kannst, musst du eben noch manuell ein Script übers Web aufrufen, was dir die Daten aus der DB holt.

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Die Stoßstange ist aller Laster Anfang! (Häfft)
        1. Hi Dennis,

          Die Uploadbegrenzung ist da i.d.R. schon ein größeres Problem. Da spielen 3 Parameter eine Rolle:
          [...]
          Diese Optionen musst du natürlich erst einmal alle prüfen, bevor du weitermachen kannst.

          Muss ich nicht mehr, denn ich habe es jetzt wie folgt gemacht:
          Das Admintool ladet die Datei in die Datenbank und führt per HTTP-Anfrage ein PHP-Script auf dem Server auf. Datenbankzugriffdaten und der Speicherpfad werden dabei übermittelt. Das Script kann jetzt ganz einfach die Datei wieder aus der DB holen, sie speichern und aus der DB löschen.

          Richtig, das wäre sozusagen eine Problemlösung, wenn es dir aus technischen Gründen nicht gelingt, die Sachen über ein Formular upzuloaden - setzt allerdings vorraus, dass die Datenbank von außen abrufbar sein muss.

          Natürlich. Über Formular geht das nicht, denn das Admintool ist ein Windowsprogramm, das das Uploaden automatisch tun muss.

          Und wenn dir nicht gerade Cronjobs zur Verfügung stehen, mit denen du z.B. alle 10 Minuten nach neuen Bilder schauen kannst, musst du eben noch manuell ein Script übers Web aufrufen, was dir die Daten aus der DB holt.

          Es ist nicht regelmässig, sondern nur, wenn man Bilder zu einem Produkt hinzufügen oder löschen will.

          Gruss

          1. Moin!

            Das Admintool ladet die Datei in die Datenbank und führt per HTTP-Anfrage ein PHP-Script auf dem Server auf. Datenbankzugriffdaten und der Speicherpfad werden dabei übermittelt. Das Script kann jetzt ganz einfach die Datei wieder aus der DB holen, sie speichern und aus der DB löschen.

            Das ist ein Joke oder? What the f**** hindert Dich daran das "ganz normal" zu machen?

            Dateiupload mit Überprüfung

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix®

            --
            Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
  3. Hallo Marko,

    Deshalb erscheint es mir viel praktischer, die Bilder in einer Mysqltabelle zu lagern (eine Tabelle ausschliesslich für Bilder + eine auto_increment Spalte).

    ich halte davon nichts. Aber das ist meine persönliche Meinung.

    Ist es ein riesiges Performance-Problem oder kann ich das so machen?
    Was empfehlt ihr mir sonst?

    Andere sind der gleichen Meinung, eine Archivsuche mit den Suchbegriffen "Bilder" "Datenbank" "speichern", z.B. http://suche.de.selfhtml.org/cgi-bin/such.pl?suchausdruck=Bilder+Datenbank+speichern&lang=on&feld=alle&index_5=on&index_6=on&index_7=on&hits=100 liefert viele Beiträge dazu, z.B. auch diesen Thread, den eine Namensvetter von Dir begonnen hatte: http://forum.de.selfhtml.org/archiv/2005/1/t99108/#m605055.

    Freundliche Grüße

    Vinzenz, der weiß, dass er einen unerwünschten Generalverweis gepostet hat.

  4. Moin!

    Ist es ein riesiges Performance-Problem oder kann ich das so machen?

    Wenn Der Shop nur 3 Besucher am Tag hat, dann nicht.

    Was empfehlt ihr mir sonst?

    Das Filesystem ist Datenbank genug. Warum willst Du eine Datenbank als Filesystem missbrauchen, wenn Du schon eines hast und die Datenbank auf dem selben läuft. Oder packst Du Deine Klamotten in einen Rucksack und den in die Reisetasche?

    aber bei den Bildern ist es mir irgendwie zu mühsam, extra einen FTP-Account einzurichten, ständig die Ordnerliste runterzuladen, und die Bilddateien aufladen.

    Und wie kommen die hübschen Bildchen in die Datenbank?
    Aha... Nur was hindert Dich daran die in das Filesystem zu schreiben?

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development