Dlaczego utworzono get.php i / lub `core / file_storage_database`?

12

Od około wersji 1.5 lub 1.6 Magento miał plik w folderze głównym o nazwie get.php. Ten plik, korzystając z core/file_storage_datamodelu, pozwala właścicielom systemu Magento na serwowanie plików multimedialnych produktów bezpośrednio z kolumn obiektów blob w bazie danych bez konieczności posiadania pliku obrazu w systemie plików. PHP obsługuje wysyłanie pliku

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

To wkracza na terytorium historii Magento, ale dlaczego ta funkcja została opracowana? Wydaje się - nieco szalony. PHP nie jest najskuteczniejszym sposobem udostępniania pliku, pamięć obiektów blob w MySQL ma historię niestabilności, a nawet stabilna implementacja obiektów blob bazy danych jest uciążliwa w pracy i z tego, co widzę Varien_File_Transfer_Adapter_Http, nie dodaje się wszelkie buforowane nagłówki tych plików.

Czy ktoś wie, dlaczego Magento opracował tę funkcję? Czy faktycznie osiąga cel / problem, który zamierza rozwiązać? Czy ktoś go używa?

Alan Storm
źródło

Odpowiedzi:

12

Znalazłem oryginalny SRS dla tej funkcji i mogę udostępnić go tutaj do celów historycznych:

Obecnie nie ma innej opcji przechowywania multimediów, ale w systemie plików serwera WWW. Takie podejście jest wystarczające, gdy działa tylko jedna instancja systemu, a baza danych znajduje się na tym samym serwerze, co instancja systemu.

Jednak najbardziej prawdopodobny sposób wdrożenia systemu nie jest taki sam. Klienci mają wiele instancji systemu wdrożonych na różnych serwerach, które wymagają synchronizacji. Dlatego jako opcje należy opracować dwie różne opcje przechowywania obrazów: Baza danych i CDN (Content Delivery Network).

CDN jako alternatywna pamięć masowa zostanie zaimplementowana w systemie wyłącznie jako opcja wsparcia, a nie jako pełna integracja z konkretnymi CDN. Administrator będzie musiał sam wybrać i skonfigurować CDN, a także dokonać drobnych zmian w konfiguracji systemu.

Nie wkleję przypadków użycia, ale w przypadku CDN wspomina tylko o zmianie podstawowych adresów URL obrazów / skór na adres URL CDN (zakładam, że wymaga PULL CDN)

Piotr Kamiński
źródło
3

Nie testowałem go szeroko, ani nie użyłem go w produkcji, ale użyłem go w moim przewodniku Elastic Beanstalk + Magento . Korzyść dla klastra węzła sieci Web bez udziału - pliki obrazów są zapisywane w backendie DB po przesłaniu przez administratora, a następnie początkowo stamtąd stamtąd (a najlepiej z CDN potem). Oznacza to, że możesz uniknąć NFS podczas udostępniania multimediów.

Ashley Schroder
źródło
2

Domyślam się, że jest przeznaczony do środowisk klastrowych. Wiele webnodes z 1 węzłem db. Jeśli sesje / pamięć podręczna znajdują się również w bazie danych db (lub innym węźle), twój webnode będzie tylko do odczytu i nie będziesz musiał synchronizować multimediów za każdym razem, gdy uruchomisz nowy webnode.

Ogólnie rzecz biorąc, zgadzam się, że wygląda to na inżynierskie rozwiązanie szukające problemu do rozwiązania.

Kristof w Fooman
źródło
2

Byłem raczej zachwycony, widząc to osobiście w Magento, ponieważ (jak wspominają inni) zapewnia to stosom z wieloma węzłami sieciowymi, aby mieć jedno wiarygodne źródło obrazów bez konieczności radzenia sobie z mocowaniami NFS.

Jeśli jesteś podobny do mnie i uruchamiasz wdrożenia, zastępując węzły sieciowe w module równoważenia obciążenia i poza nim (np. Używając konfiguracji uruchamiania AWS / grup automatycznego skalowania), jest to całkiem rozsądne.

Zazwyczaj chciałbyś unikać umieszczania obrazów w bazie danych z różnych powodów, ale sposób, w jaki działa ten proces (w zasadzie), polega na tym, że obraz jest pobierany do lokalnego systemu plików z bazy danych, a następnie podawany stamtąd do kolejnych żądań .

Jeśli możesz pójść o krok dalej (więc jest jeszcze mniej próśb o ściągnięcie obrazów w dół / odniesienie z systemu plików), zaleciłbym użycie CDN i ustawienie swojej strony jako źródła oraz zmianę adresu URL mediów, jak opisano przez innych.

Na marginesie, większość konfiguracji MySQL będzie miała bardzo niską wartość „max_allowed_packet”, która ogranicza rozmiar transferu danych dozwolony do twojego DB. Jeśli planujesz przechowywać zdjęcia w bazie danych, możesz to sprawdzić, aby nie strzelać sobie w stopę.

Jason Rose
źródło