Warum wurde get.php und / oder core / file_storage_database erstellt?


12

Ab Version 1.5 oder 1.6 hatte Magento eine Datei im Stammordner namens get.php. Mithilfe dieses core/file_storage_dataModells können Magento-Systembesitzer ihre Produktmediendateien direkt über Blob-Spalten in der Datenbank bereitstellen, ohne dass sich eine Bilddatei im Dateisystem befindet. PHP verarbeitet das Senden der Datei

#File: get.php
function sendFile($file)
{
    if (file_exists($file) || is_readable($file)) {
        $transfer = new Varien_File_Transfer_Adapter_Http();
        $transfer->send($file);
        exit;
    }
}

Dies dringt in das Gebiet der Magento-Geschichte vor, aber warum wurde diese Funktion entwickelt? Es scheint - etwas verrückt. PHP ist nicht die effizienteste Methode, um eine Datei bereitzustellen. Der MySQL-Blob-Speicher ist in der Vergangenheit instabil, und selbst eine stabile Implementierung von Datenbank-Blobs ist ein mühsames Unterfangen, mit dem ich arbeiten Varien_File_Transfer_Adapter_Httpmuss Caching-Header zu diesen Dateien.

Weiß jemand, warum Magento diese Funktion entwickelt hat? Erreicht es tatsächlich das Ziel / Problem, das es lösen soll? Benutzt es jemand?

Antworten:


12

Ich habe das ursprüngliche SRS für dieses Feature gefunden und kann es hier für historische Zwecke weitergeben:

Derzeit gibt es keine andere Möglichkeit, Medien zu speichern, sondern im Dateisystem des Webservers. Dieser Ansatz ist ausreichend, wenn nur eine Instanz des Systems ausgeführt wird und sich die Datenbank auf demselben Server befindet wie die Systeminstanz.

Die wahrscheinlichste Art der Systembereitstellung ist jedoch nicht dieselbe. Kunden haben mehrere Instanzen des Systems auf verschiedenen Servern implementiert, für die eine Synchronisierung erforderlich ist. Aus diesem Grund sollen zwei verschiedene Optionen zum Speichern von Bildern als Optionen entwickelt werden: Datenbank und CDN (Content Delivery Network).

CDN als alternativer Medienspeicher wird nur als Support-Option im System implementiert, nicht als vollständige Integration mit einem bestimmten CDN. Der Administrator muss das CDN selbst auswählen und konfigurieren sowie geringfügige Änderungen an der Systemkonfiguration vornehmen.

Ich füge keine Anwendungsfälle ein, aber für CDN wird nur erwähnt, dass die Basis-URLs für Bilder / Skins in die CDN-URL geändert werden (ich gehe davon aus, dass PULL CDN erforderlich ist).


3

Ich habe es weder ausgiebig getestet noch in der Produktion verwendet, sondern für meinen Elastic Beanstalk + Magento- Leitfaden verwendet. Der Vorteil ist für einen Webknoten-Cluster ohne gemeinsame Nutzung: Die Image-Dateien werden beim Hochladen über den Administrator im DB-Backend gespeichert und von dort (und im Idealfall anschließend vom CDN) bereitgestellt. Dies bedeutet, dass Sie NFS für die Freigabe von Medien vermeiden können.


2

Ich vermute hier, dass es für Cluster-Umgebungen gedacht ist. Mehrere Webknoten mit 1 db Knoten. Wenn sich Sitzungen / Cache auch in der Datenbank (oder einem anderen Knoten) befinden, ist Ihr Webknoten schreibgeschützt und Sie müssen keine Medien synchronisieren, wenn Sie einen neuen Webknoten aufrufen.

Insgesamt stimme ich zu, dass es sich um eine ausgereifte Lösung handelt, die nach einem zu lösenden Problem sucht.


2

Ich habe mich sehr darüber gefreut, dies in Magento persönlich zu sehen, da Stapel mit mehreren Webknoten (wie andere erwähnen) eine einzige autorisierende Quelle für die Bilder haben, ohne sich mit NFS-Bereitstellungen befassen zu müssen.

Wenn Sie wie ich Bereitstellungen ausführen, indem Sie Webknoten in und aus einem Load Balancer ersetzen (z. B. mithilfe von AWS Launch Configurations / Auto Scaling Groups), ist dies eigentlich recht vernünftig.

Normalerweise möchten Sie aus verschiedenen Gründen vermeiden, Bilder in die Datenbank einzufügen. Die Funktionsweise dieses Vorgangs besteht jedoch darin, dass das Bild aus der Datenbank in das lokale Dateisystem gezogen und von dort für nachfolgende Anforderungen bereitgestellt wird .

Wenn Sie noch einen Schritt weiter gehen können (so gibt es noch weniger Anforderungen, die Bilder aus dem Dateisystem abzurufen / zu referenzieren), würde ich empfehlen, eine CDN zu verwenden und Ihre Website als Ursprung festzulegen und die Medien-URL wie von anderen beschrieben zu ändern.

Nebenbei bemerkt, die meisten MySQL-Konfigurationen haben einen sehr niedrigen Wert für "max_allowed_packet", der die Größe der Datenübertragung in Ihre Datenbank begrenzt. Wenn Sie vorhaben, Bilder in der Datenbank zu speichern, sollten Sie dies überprüfen, damit Sie sich nicht selbst in den Fuß schießen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.