Beschleunige dein Drupal und spare Speicherplatz. Schwierigkeitsgrad: für vortgeschrittene
am 27.09.2016 - 17:50 Uhr in
Wer kennt es nicht?
Man legt ein Produkt an mit 100 Produktvariationen und dem selben Bild.
Als Beispiel: Ein Schließzylinder in Länge 30/30 mit 3 bis 20 Schlüsseln.
Weitere in Längen 30/35, 30/40, 30/45, ..., 50/60.
So hat man, selbst wenn man es auf die Nodes beschränkt, ganz schnell riesige Datenmengen von "einem" Bild auf dem Server und die DB bläht sich auch unendlich auf.
Module die das verhindern sollen gibt es zwar, doch scheinen die nicht mit feeds zusammen zu funktionieren.
Dieses Problem kann man recht unspektakulär lösen.
Hier gehen wir Schritt für Schritt vor.
Nachdem wir unser Produktportfolio importiert haben, sehen wir uns in der DB die Tabelle "file_managed" an.
Es kommt vor, dass die oberste "fid" auf "image-name_0.jpg" verweist.
Wir benötigen die "fid" image-name.jpg".
Als nächstes laden wir uns aus der DB die Tabelle "field_data_field_image" beziehungsweise "field_data_field_your-feldname" als "CSV-file" runter und öffnen dieses.
In der Spalte "fid" kopieren wir nun die "fid" von "image-name.jpg" in alle nachfolgenden Felder, welche das selbe Bild haben. Speichern und in der DB importieren.
Nun improtieren wir die selbe Datei nach "field_revision_field_your-fieldname"
Cache löschen, Cron ausführen.
Jetzt greifen alle Produkte auf die selbe Bilddatei zu und alle anderen Bildderivate können gelöscht werden.
Als nächstes exportieren wir die Tabelle "file_managed", öffnen diese und löschen hier die nicht mehr benötigten Zeilen, welche auf die Bildderivate zielen.
Hochladen, Cache löschen, Cron ausführen.
Wer sehr viele Produkte hat, dem rate ich:
Für jedes Produkt einen eigenen Bildverzeichnispfad.
Für jedes Produkt ein eigenes Bildfeld.
(image-field-1, image-field-2, etc.)
Ich hoffe das hilft euch ein wenig.
Beste Grüße
Frank Wiedenfeld
-------------------------------------------------
Accelerate your Drupal Commerce and save space
Who does not know it?
It creates a product with 100 product variations and the same picture.
As an example: A locking cylinder in length 30/30 of 3 to 20 keys.
More in lengths 30/35, 30/40, 30/45, ..., 50/60.
So you have, even if you look at only the Nodes, quickly huge amounts of data from "a" picture on the server and the DB inflates also infinity.
Modules are intended to prevent the are there, but do not seem to be working with feeds together.
This problem can be solved quite unspectacular.
Here we go step by step.
After we have imported our product portfolio, we are in the DB table "file_managed".
It happens that the top "fid" refers to "image-name_0.jpg".
We need the "fid" image-name.jpg ".
Next, we invite us from the DB table "field_data_field_image" or "field_data_field_your-fieldname" down as "CSV file" and open it.
In the column "fid" we will copy the "fid" of "image-name.jpg" into all these fields, which have the same image. Import and save in the DB.
Now import the same file to "field_revision_field_your-fieldname".
Clear cache, run cron.
Now grab all the products in the same image file and all other image derivatives can be deleted.
Next, we export the table "file_managed", these open and delete here unneeded rows, which are aimed at the image derivatives.
Upload, Clear cache, run Cron.
Who has very many products, I advise:
For each product its own image directory path.
For each product its own field.
(Image-field-1, image-field-2, etc.)
I hope this helps you a little bit.
Best regards
Frank Wiedenfeld
Translated with Google
- Anmelden oder Registrieren um Kommentare zu schreiben
Genialer Tipp
am 28.09.2016 - 07:44 Uhr
Super Tipp Wird gleich ausprobiert. Schönes Tutorial!
Eine interessante
am 28.09.2016 - 15:09 Uhr
Eine interessante Herangehensweise und es spricht eine "Real Life"-Problematik an und sicherlich gut das mal zu thematisieren.
Das Vorgehen zeugt von keiner Furcht vor der Datenbank :-)
IMHO:
Ein bisschen hacky und auch nicht unaufwändig ist das aber schon.
Vielleicht für eine einmalige Aktion nach einem Erstimport geeignet aber nicht unbedingt elegant und für kontinuierliche Importe eher nicht geeignet.
Wenn alle Variationen das gleiche Bild haben macht es doch vielleicht Sinn das Bild nur im zugehörigen Node zu hinterlegen.
Alternativ könnte man denke ich mit Feeds Tamper vielleicht auch eine solche Lösung schaffen die dann aber in Feeds integriert und automatisiert ist.
Weitere Option sollte das Media-Modul sein, inwiefern sich das allerdings mit Feeds verträgt weiß ich nicht.
Entity Reference
am 28.09.2016 - 19:24 Uhr
Kann man da nicht auch mit Referenzen bzw. Entity Reference arbeiten?
Man erstellt das Bild einmal und referenziert es dann in allen Nodes, welche exakt das gleich Bild beinhalten sollen.
Moin, Drupal legt für jedes
am 28.09.2016 - 19:45 Uhr
Moin,
Drupal legt für jedes Bild, dass über root/bildordner importiert wird ein Derivat an "image.jpg_0, image.jpg_1, etc." und das setzt sich dann auch fort in den "Image-Styles" und schwub die wub ist die HDD voll mit Müll.
Und so wie ich es beschrieb "ich habe für jeden Schließzylinder" etwa, mind. 20 Nodes, kommen wir hier schnell phantastische Datenmengen.
Mein beschriebener Weg beinhaltet auch, dass dieses eine und einzige Bild mit einzigartigen "Bildtiteln und ??? Ersatzbeschreibungen (ich komme gerade nicht auf den Fachausdruck, für den Ersatztext, wenn das Bild nich dargestellt werden kann)" versehen werden kann.
Ich denke Feeds Temper und andere Module habe ich für diesen speziellen Fall schon bis zum exitus erfolglos probiert.
Was den Aufwand angeht: über 1500 Produkte mit etwa 35000 Produktvariationen konnte ich "nachdem ich mich darauf eingefuchst hatte" binnen gut 15 Minuten anpassen und konnte einen realen Speedzuwachs messen, da die Tabelle "file_managed" von MB auf KB zusammengeschrumpft ist und auch nicht 1000de von Bildern (img.jpg_35001) erst abgefragt werden musten
Ein entsprechendes Modul für den DB-Upgrade wünsche ich mir. Dann kann man auch News etc. mit selben Bild easy und nutzerfreundlich (Ladezeiten) automatisiert importieren.
Grundlegend denke ich, dass es bei der Entwicklung des Cores einen kleinen Denkfehler gab, der darauf abzielte, dass Drupal darauf ausgelegt ist, dass ein Bild mit gleichem Namen nicht das gleiche Bild beinhalten muss, was allerdings auch nicht wirklich falsch ist...
Beste Grüße aus Hamburg
Frank