DATA-URL statt Images - Größe

Alice

Erfahrenes Mitglied
Hallo.

Bin gerade dabei über 300 Grafiken ins "DATA-URL" Format zu formatieren. Habe ca. 90 Datensätze fertig und die PHP-Datei ist bereits knapp 4MB groß.

Was kann man da machen?

Jemand eine Lösung?

Anmerkung: Niemand bekommt die Grafiken/DATA-URL zu gesicht. Diese werden NUR von IMagick-PHP-Extension verarbeitet.

Statt einen Ordner voll mit Grafiken erstelle ich nun ein Mehrdimensionales Array mit Width, Height und halt der DATA-URL.

Eine Idee von mir wäre das ganze als XML zu speichern, aber ich weiss nicht ob das effektiv wäre.
 
Na ich hab keine Ahnung ob das so richtig ist. :D

Normal habe ich ja ein paar Ordner mit meinen Grafiken. Mit Data-URL brauche ich die Grafiken ja nicht mehr. Die ganzen Data-URL´s habe ich in ein Array gepackt und die Datei ist nun 15 MB groß.

Statt:

Code:
- Ordner
-- Kaffee_01.png
-- Kaffee_02.png
-- Kaffee_03.png
...


Nun:

PHP:
$Kaffee_Varianten
{
   'Kaffee-Europa-001' => array(510, 510, 'data:image/gif;base64,R0lGODlhMAAwANU/AOLi7Ojo15CPjdzc6La2yv7+/tvb2tTU4VYhENnZ52xsa/T0+a2tw7e70NzcysvL2+np8PHx9sTEtQQBAfn5/KSksZuZsu7u9KmlncDA0oRmTa+sreXl7rOzpFRUVDYFAra2vHBSPufn7ezs8/f3+s3N1l04Is3O4YB/gMbGyMXF17WpoLvA1MbK3Zybk9bX5urq8iEhIefn8tHS4tjZ6+Hh1Nfb56Wiv7Gxxt/f6u/v9vv7/cjI2NDQ3dDPv+rq1iH5BAEAAD8ALAAAAAAwADAAAAb/wJ9wSCwaj8ikcslsOp/QqHRKrVqJgYDBIOqKANvsNak9XBYwwGCQA8guJMqoZwiMh4HD6PJi+VUtLSczLzYDbhEkACA1V1ojES0Nk3+ChDRsHDIwOgsLLyBVWjs2k5QNGxgYLiuprT0cOhELFAsjGHZSBhSlkzgCIQjCCCYmISEayBorBrQUEQAuuU8BABemKAgf29zcCMchJskrPjsUMCASUQEFMw0V2t3yExMfJggaxfYuFDo5KNOasGvBQN42eggT0vMm7gIABQGZsDthYp7Ciwq3YXgYcUmAHQYQHsRIUmSOBBCp1QCww8PCDyVjupBxAoUDJ3kW5ChAwmW9/5gkBcBIkKGouiUrC4x4QKFAgQ0x6sEESs9DCR0cDjQggIMHg0ZIDETYASDBiRFOeW7wEDVmDAUpFkSAwOFEUa4ZcNw0YoBEgZMJXiRImzZCChcKPCj2oADFhhIUdsiFMALAjMAEuDbA4aNI3wJlEySovIOwadOSL+yBQVfHixmEBqggwCBDBbA/AgwosEB0gt1oTheQHEEHaw45Brw4kAOCCA4RZhx6LRgHgxPShBhwysE3WtCoa0UY4VyN8hk9HuTggHzEDr8wCPVgYL3zj50FBvhe4FREU6fvRXDBcckFdkB6KjwAAAAQLHDDDSrAEN0ADFwnQBYRDKefaPw5Bf+AU+LpQB4HACSn3wEH2JXBIRTwYIEFDahQQAI5WPcACjUE4Ndf3qXFAQXiCTjigiaKdgAPDRzwIwMvWiCjaNZlYJOOTsng225OkSCCXJCoBoMMJJaYQ4EzENBDBBTc8CIOvKFXoQoo+BBAhyT4lgAMaUEwIATFqTaCDHSxR+QLBCTQVA4qDGDOADNYx8AMCjgQAAd52nlBWjlcwMEFEQjoJwysQQCBDCo0AAGAO5iTgzv0MfBCpD8cQFhogXFQ2l9pnOFJp7wW1+gABzj33FYLOtoAAwD9UIMMaZEl2gsvfOgUDOzF4gwFJEDDg3o5AEmCJz10QRt9AyjQwRAgmAb/QWAv5OBJU1oyCMNzJLaxBgBDAiALANZZN4MFOOKRLmE6CQYqDCPIsoCYYwIrXQIoouhuBA9UWOEJDChw1BAODExYBGMuKHLDy/WQHg8qpKxepwfQ1u8BGZ9rhAMV3DpcqmgUaOdy6PVwwACxXCCboxU2AIAF5nYkRAAu9ABgtp3KlYZyoq1x3gN5WWwxAS+00NjGSAQggQC7pUatmMuVgPJdXGlNHws01KSAC3tJhIEAKuAMgRoQ96C2CkVt5SgOGbwgg5QKCCDnOmMLAAIAJJCggwgnHfjA5T20K8MAOKDQGAaSiuKABC6ggIIAFRCQQQmXZ0BABQJ4njgGi9+xILQDPnSwggsuCOC7Cxh0IIEDOdpu/PHIJ6/88sw3z3wQADs='),
  'Kaffee-Europa-002' => array(510, 510, 'data:image/gif;base64,R0lGODlhJgAoALMAAAEBARUVFTIyMlBQUGtra4ODg5ubm7Ozs8jIyNnZ2eHh4eXl5evr6/Pz8/////v7+yH5BAkAAA4ALAAAAAAmACgAAAj+AB0IHEhw4IMGDBYsUMBQIYMGDwpKnFgQIcOLGDEyiEixo4MHDDJmVJhxo0eJDURiXHiAgIGFFxc0ODkwpEqGDA4MIHAggcqZJ23eXFBgwAEGCW8CpShU5QICBBIkPIAApsilFW/iLEBgAQMEBIxavSrxgVYFCxAMkGpAwMuxIhdIbCqSgYECDQ4IQEBXKUGzZ+0aaOCyr1aODgxnTMDzruKfAgGfRZuggOWXk2MKTJmZ8tq1nRlGfLySQdECAkIznAn3JmMBYRO01rpxssO7ChAcoIpA6uyVnEuH1G3gQPEDlrmGLXDgd8PgOBHcJVDAwHHj1hX4TNASM+2VRQ3+JEA8EaFXBlHPBrdbgOMC41DDUmde9QFYAVKTXo2Z3sCAAAAEKOCAAAQgwACoWVecbBkF9xQBAggIIIEFHsjcewEaKIBbVi3wAEwLGIAAAlwNYOJO1fXEwEcJLYCicgIEUFVDiTUkHU0OcNaAf0g10AACAcgI04qcLdTeSQ0sZN9eDHBHQJDNXTTTh18hd4BHPjrQUgDUDRBjAAXMeBFH9zFn1El6AXAgdToNkKRGAh0QwABySXfXUX/lNECABSjw0I4BeDemQAUAkMBmlykX1oYTuoWUAjoFSteKAiEAAAGItURdWBMa2GcDCbSl5lEikWeAmuINpIB1l/EFqgFST6LKYIMSIRChmtRZZ5xliwYpAHN+qkTpRGB5yaiGay7o1W9yBUVSAj41hJRzOOEIkmp14TgQdKHJpG2e3Zr0bUEH6TfSQ+SNWxZCSPWYbkcBAQA7')
}

Das Problem ist: Es ist zu groß!

Wie würdet ihr das machen?

Der Nachteil an Data-URL ist ganz klar die größe. Der Vorteil ist keine Grafiken mehr in den Ordnern. Mir gefällt das. :) Aber ich kann z.B. die Daten "Kaffee-Varianten.php" kaum noch lokal am PC öffnen weil sie dermaßen groß ist. Da meine Grafiken "Hochauflösend" sind, kann man sich ja vorstellen wie lange "der Text" von nur EINER Grafik ist... :(

Ich suche eine Möglichkeit diese 3 Angaben pro Kaffee-Varianten zu speichern.

- Width
- Height
- DATA-URL
 
Warum möchtest du die Bilder in das Data-URI-Format konvertieren? Wenn du es Base64 kodierst, dann hast du im Schnitt eine Speichervergrößerung um 33%.
 
Ich mache das ganze weil meine IMagick-PHP-Extension plötzlich nicht mehr mit Image-Tags innerhalb einer SVG klarkommt. Keine Fehler. Keine Meldung. Nur eine leere Grafik wird erzeugt. Mit DARA-URL funktioniert es.

Mein "Kaffee-Bilder-Ordner" ist ca. 11 MB groß und meine "Kaffee-Bilder-Data-URL.php" ist ca. 15 MB groß. Der Unterschied ist aber, dass mein Skript nicht jedes Bild (Bild für Bild) durchlaufen muss. Als Data-URL macht der das aber...
 
Warum legst du die Daten nicht in einer Datenbank ab, von der du die benötigten heraus lädst?

Dann brauchst du keine riesen große Datei.

Oder wenn du diese kategorisieren kannst, dann solltest du dies gründlich wie möglich, aber nur so gründlich wie nötig machen und je nach Kategorie in einer Datei ablegen.

Dann legst du nur die Bildbezeichnungen in der DB ab und fragst darin ab, in welcher Kategorie sie zu finden ist, falls du diese Daten unbedingt in einer Datei liegend haben willst.
 
Zuletzt bearbeitet:
Ich habe die ganze Scheiße nun als XML-Datei erstellt.

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Kaffee-Sorten>
  <Kaffee-Variante-0001>
    <W>500px</W>
    <H>500px</H>
    <I>data:image/png;base64,................................</I>
  </Kaffee-Variante-0001>
  <Kaffee-Variante-0002>
    <W>500px</W>
    <H>500px</H>
    <I>data:image/png;base64,................................</I>
  </Kaffee-Variante-0002>
  <Kaffee-Variante-0003>
    <W>500px</W>
    <H>500px</H>
    <I>data:image/png;base64,................................</I>
  </Kaffee-Variante-0003>
...
...
...
</Kaffee-Sorten>

Kann man das noch verbessern? Wenn ja: Wie? :)
 
Noch eine Frage.

Wäre es "besser" 4-5 "kleinere" XML-Dateien zu erstellen oder direlt eine große?

Ich schätze eine große wäre 200 MB groß.

Ist das zuviel?
 
So...

Ich habe ein PHP-Skript geschrieben welches mir alle Grafiken aus verschiedenen Ordnern inkl. Daten wie Breite, Höhe usw. ausliest und selbstständig eine XML-Datei erstellt. Das Skript wandelt die Grafiken vollautomatisch ins DATA-URL-Format um.

Das ganze dauert nur 3 Sekunden. :D Dabei werden 2500 Grafiken (kleinste 500x500px) verarbeitet.

Die XML-Datei ist 120 MB groß. Habe mal zum testen 20 Grafiken mit PHP ausgegeben und es ladet sofort. So als gäbe es kein Unterschied. Hoffentlich bleibst das auch mit IMagick so....

PHP:
<?php
  // DATA-URL-Creator
  error_reporting(E_ALL);
  @ini_set("memory_limit",'512M');
  @set_time_limit(120);

  // Dateiname der XML-Datei
  $D_Name = "Kaffee";

  // Verzeichnis (Interner Server Zugriff)
  $Verzeichnis_Int01 = "/www/htdocs/w56a649g/kaffee/de/v001/";
  $Verzeichnis_Int02 = "/www/htdocs/w56a649g/kaffee/de/v002/";
  $Verzeichnis_Int03 = "/www/htdocs/w56a649g/kaffee/de/v003/";
  $Verzeichnis_Int04 = "/www/htdocs/w56a649g/kaffee/de/v004/";
  $Verzeichnis_Int05 = "/www/htdocs/w56a649g/kaffee/de/v005/";

  // Verzeichnis (Externer Server Zugriff)
  $Verzeichnis_Ext01 = "http://www.meine-seite.de/kaffee/de/v001/";
  $Verzeichnis_Ext02 = "http://www.meine-seite.de/kaffee/de/v002/";
  $Verzeichnis_Ext03 = "http://www.meine-seite.de/kaffee/de/v003/";
  $Verzeichnis_Ext04 = "http://www.meine-seite.de/kaffee/de/v004/";
  $Verzeichnis_Ext05 = "http://www.meine-seite.de/kaffee/de/v005/";

  // Gruppenbezeichnung (innerhalb XML)
  $G_Name01 = "Kaffee_LowBudget";
  $G_Name02 = "Kaffee_Normal";
  $G_Name03 = "Kaffee_Better";
  $G_Name04 = "Kaffee_HighBudget";
  $G_Name05 = "Kaffee_Gold";

  // Präfix (innerhalb XML)
  $P_Name01 = "";
  $P_Name02 = "";
  $P_Name03 = "DS-";
  $P_Name04 = "";
  $P_Name05 = "";

  // Verzeichnisse öffnen
  $Open_V01 = openDir($Verzeichnis_Int01);
  $Open_V02 = openDir($Verzeichnis_Int02);
  $Open_V03 = openDir($Verzeichnis_Int03);
  $Open_V04 = openDir($Verzeichnis_Int04);
  $Open_V05 = openDir($Verzeichnis_Int05);

  // 1. While-Schleife
  while ($Files = readDir($Open_V01))
  {
  // Nur dieses Verzeichnis auslesen
  if ($Files != "." && $Files != "..")
  {
  // Width und Height auslesen
  $GetImageSize = getimagesize($Verzeichnis_Ext01.$Files);

  // Grafiken Base64 Codieren
  $Base64 = base64_encode(file_get_contents($Verzeichnis_Ext01.$Files));

  // Base 64 Data-Url erstellen
  $DATA_URL = 'data:image/png;base64,'.$Base64;

  // .png aus Dateiname entfernen
  $Files = str_replace(".png","", $Files);

  // XML-Arrays erstellen
  $Create_XML01[] = "\t\t".'<'."$P_Name01$Files".'>';
  $Create_XML01[] = "\t\t\t".'<W>'."$GetImageSize[0]".'</W>';
  $Create_XML01[] = "\t\t\t".'<H>'."$GetImageSize[1]".'</H>';
  $Create_XML01[] = "\t\t\t".'<I>'."$DATA_URL".'</I>';
  $Create_XML01[] = "\t\t".'</'."$P_Name01$Files".'>';
  }
  }

  // 2. While-Schleife
  while ($Files = readDir($Open_V02))
  {
  // Nur dieses Verzeichnis auslesen
  if ($Files != "." && $Files != "..")
  {
  // Width und Height auslesen
  $GetImageSize = getimagesize($Verzeichnis_Ext02.$Files);

  // Grafiken Base64 Codieren
  $Base64 = base64_encode(file_get_contents($Verzeichnis_Ext02.$Files));

  // Base 64 Data-Url erstellen
  $DATA_URL = 'data:image/png;base64,'.$Base64;

  // .png aus Dateiname entfernen
  $Files = str_replace(".png","", $Files);

  // XML-Arrays erstellen
  $Create_XML02[] = "\t\t".'<'."$P_Name02$Files".'>';
  $Create_XML02[] = "\t\t\t".'<W>'."$GetImageSize[0]".'</W>';
  $Create_XML02[] = "\t\t\t".'<H>'."$GetImageSize[1]".'</H>';
  $Create_XML02[] = "\t\t\t".'<I>'."$DATA_URL".'</I>';
  $Create_XML02[] = "\t\t".'</'."$P_Name02$Files".'>';
  }
  }

  // 3. While-Schleife
  while ($Files = readDir($Open_V03))
  {
  // Nur dieses Verzeichnis auslesen
  if ($Files != "." && $Files != "..")
  {
  // Width und Height auslesen
  $GetImageSize = getimagesize($Verzeichnis_Ext03.$Files);

  // Grafiken Base64 Codieren
  $Base64 = base64_encode(file_get_contents($Verzeichnis_Ext03.$Files));

  // Base 64 Data-Url erstellen
  $DATA_URL = 'data:image/png;base64,'.$Base64;

  // .png aus Dateiname entfernen
  $Files = str_replace(".png","", $Files);

  // XML-Arrays erstellen
  $Create_XML03[] = "\t\t".'<'."$P_Name03$Files".'>';
  $Create_XML03[] = "\t\t\t".'<W>'."$GetImageSize[0]".'</W>';
  $Create_XML03[] = "\t\t\t".'<H>'."$GetImageSize[1]".'</H>';
  $Create_XML03[] = "\t\t\t".'<I>'."$DATA_URL".'</I>';
  $Create_XML03[] = "\t\t".'</'."$P_Name03$Files".'>';
  }
  }

  // 4. While-Schleife
  while ($Files = readDir($Open_V04))
  {
  // Nur dieses Verzeichnis auslesen
  if ($Files != "." && $Files != "..")
  {
  // Width und Height auslesen
  $GetImageSize = getimagesize($Verzeichnis_Ext04.$Files);

  // Grafiken Base64 Codieren
  $Base64 = base64_encode(file_get_contents($Verzeichnis_Ext04.$Files));

  // Base 64 Data-Url erstellen
  $DATA_URL = 'data:image/png;base64,'.$Base64;

  // .png aus Dateiname entfernen
  $Files = str_replace(".png","", $Files);

  // XML-Arrays erstellen
  $Create_XML04[] = "\t\t".'<'."$P_Name04$Files".'>';
  $Create_XML04[] = "\t\t\t".'<W>'."$GetImageSize[0]".'</W>';
  $Create_XML04[] = "\t\t\t".'<H>'."$GetImageSize[1]".'</H>';
  $Create_XML04[] = "\t\t\t".'<I>'."$DATA_URL".'</I>';
  $Create_XML04[] = "\t\t".'</'."$P_Name04$Files".'>';
  }
  }

  // 5. While-Schleife
  while ($Files = readDir($Open_V05))
  {
  // Nur dieses Verzeichnis auslesen
  if ($Files != "." && $Files != "..")
  {
  // Width und Height auslesen
  $GetImageSize = getimagesize($Verzeichnis_Ext05.$Files);

  // Grafiken Base64 Codieren
  $Base64 = base64_encode(file_get_contents($Verzeichnis_Ext05.$Files));

  // Base 64 Data-Url erstellen
  $DATA_URL = 'data:image/png;base64,'.$Base64;

  // .png aus Dateiname entfernen
  $Files = str_replace(".png","", $Files);

  // XML-Arrays erstellen
  $Create_XML05[] = "\t\t".'<'."$P_Name05$Files".'>';
  $Create_XML05[] = "\t\t\t".'<W>'."$GetImageSize[0]".'</W>';
  $Create_XML05[] = "\t\t\t".'<H>'."$GetImageSize[1]".'</H>';
  $Create_XML05[] = "\t\t\t".'<I>'."$DATA_URL".'</I>';
  $Create_XML05[] = "\t\t".'</'."$P_Name05$Files".'>';
  }
  }

  // Verzeichnisse schließen
  closeDir($Open_V01);
  closeDir($Open_V02);
  closeDir($Open_V03);
  closeDir($Open_V04);
  closeDir($Open_V05);

  // XML-Datei erstellen
  $XML01 = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'."\n";
  $XML02 = '<Kaffee-Col>'."\n";
  $XML03 = "\t".'<'."$G_Name01".'>'."\n";
  $XML04 = implode("\n", $Create_XML01)."\n";
  $XML05 = "\t".'</'."$G_Name01".'>'."\n";
  $XML06 = "\t".'<'."$G_Name02".'>'."\n";
  $XML07 = implode("\n", $Create_XML02)."\n";
  $XML08 = "\t".'</'."$G_Name02".'>'."\n";
  $XML09 = "\t".'<'."$G_Name03".'>'."\n";
  $XML10 = implode("\n", $Create_XML03)."\n";
  $XML11 = "\t".'</'."$G_Name03".'>'."\n";
  $XML12 = "\t".'<'."$G_Name04".'>'."\n";
  $XML13 = implode("\n", $Create_XML04)."\n";
  $XML14 = "\t".'</'."$G_Name04".'>'."\n";
  $XML15 = "\t".'<'."$G_Name05".'>'."\n";
  $XML16 = implode("\n", $Create_XML05)."\n";
  $XML17 = "\t".'</'."$G_Name05".'>'."\n";
  $XML18 = '</Kaffee-Col>'."\n";

  $XML1 = fopen("/www/htdocs/w56a649g/kaffee/".$D_Name.".xml", "w");
  $XML2 = fwrite($XML1, $XML01.$XML02.$XML03.$XML04.$XML05.$XML06.$XML07.$XML08.$XML09.$XML10.$XML11.$XML12.$XML13.$XML14.$XML15.$XML16.$XML17.$XML18);
  $XML3 = fclose($XML1);

  // XML-Datei fertig erstellt
  echo 'Die XML-Datei wurde erfolgreich erstellt.';
?>

Ist sicherlich nicht das schönste Skript aber dafür spare ich mir eine Menge arbeite... Was mich etwas geschockt hat: Das Skript braucht 250 MB Speicher zum laufen.

Bin für jede Form der Kritik/Verbesserungsvorschläge offen.
 
Brauchst du die Daten wohl doch unbedingt im Dateiformat???

Müssen immer alle Daten als Datei verfügbar sein, oder wäre das nicht praktischer, die ganzen Daten in einer Datenbank zu lagern und gegebenenfalls nur die entsprechenden Daten abzurufen und darauf falls benötigt, die Dateien virtuell mit den benötigten Daten zu erzeugen, welche du ja auch nicht abspeichern brauchst? Da brauchst du keine Limits hoch setzen, wenn es nicht zu viele sein werden, die pro Scriptdurchlauf verfügbar sein müssen und ich denke, dass dies mit Sicherheit die Leistung des Servers schont, wenn mal nicht nur du, sondern vielleicht 20 oder 100 gleichzeitig durch Zugriff, das abrufen der Daten startet, weil die Dateien sind ja nicht für so riesige Datenmenge gedacht, deswegen wurden ja die Datenbanken entwickelt.
 

Neue Beiträge

Zurück