Mengapa get.php dan / atau `core / file_storage_database` Dibuat?

12

Sejak sekitar versi 1.5 atau 1.6, Magento punya file di folder root bernama get.php. File ini, menggunakan core/file_storage_datamodel, memungkinkan pemilik sistem Magento untuk menyajikan file media produk mereka langsung dari kolom gumpalan dalam database tanpa memiliki file gambar pada sistem file. PHP menangani pengiriman file

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

Ini berbelok ke wilayah sejarah Magento, tetapi mengapa fitur ini dikembangkan? Tampaknya - sedikit gila. PHP bukan cara paling efisien untuk melayani file, penyimpanan gumpalan MySQL memiliki sejarah tidak stabil, dan bahkan implementasi gumpalan basis data yang stabil adalah pekerjaan yang menyulitkan di belakang, dan dari apa yang dapat saya lihat Varien_File_Transfer_Adapter_Httptidak menambah setiap header caching ke file-file ini.

Adakah yang tahu mengapa Magento mengembangkan fitur ini? Apakah itu benar-benar mencapai tujuan / masalah apa pun yang ingin diselesaikan? Adakah yang menggunakannya?

Alan Storm
sumber

Jawaban:

12

Saya sebenarnya menemukan SRS asli untuk fitur ini dan dapat membagikannya di sini untuk tujuan bersejarah:

Saat ini tidak ada pilihan lain untuk menyimpan media, tetapi dalam sistem file dari server web. Pendekatan ini cukup baik ketika hanya ada satu instance dari sistem yang berjalan dan database terletak pada server yang sama dengan instance sistem.

Namun, cara penyebaran sistem yang paling mungkin tidak sama. Pelanggan memiliki beberapa contoh sistem yang digunakan pada server yang berbeda, yang memerlukan sinkronisasi. Inilah sebabnya, dua opsi berbeda untuk menyimpan gambar harus dikembangkan sebagai opsi: Database dan CDN (Content Delivery Network).

CDN sebagai media penyimpanan alternatif akan diimplementasikan dalam sistem sebagai opsi dukungan saja, bukan sebagai integrasi penuh dengan CDN tertentu. Admin harus memilih dan mengkonfigurasi CDN sendiri serta melakukan perubahan kecil dalam konfigurasi sistem.

Saya tidak akan menempelkan kasus penggunaan tetapi untuk CDN hanya menyebutkan perubahan URL Dasar untuk gambar / skins ke url CDN (saya berasumsi ini membutuhkan PULL CDN)

Piotr Kaminski
sumber
3

Saya belum mengujinya secara ekstensif, juga tidak menggunakannya dalam produksi, tetapi menggunakannya untuk panduan Elastic Beanstalk + Magento saya . Manfaatnya adalah untuk cluster node web tanpa-berbagi - file gambar dapat disimpan dalam DB backend ketika diunggah melalui admin, dan kemudian awalnya disajikan dari sana (dan idealnya dari CDN setelah itu). Ini berarti Anda dapat menghindari NFS untuk berbagi media.

Ashley Schroder
sumber
2

Dugaan saya di sini adalah bahwa ini dimaksudkan untuk lingkungan cluster. Beberapa webnode dengan simpul 1 db. Jika sesi / cache juga ada di db (atau simpul lain), webnode Anda hanya akan dibaca dan Anda tidak perlu menyinkronkan media kapan pun Anda membuka webnode baru.

Secara keseluruhan saya setuju bahwa itu tampak seperti solusi rekayasa mencari masalah untuk dipecahkan.

Kristof di Fooman
sumber
2

Saya agak senang melihat ini di dalam Magento, secara pribadi, karena (seperti yang disebutkan orang lain) ini menyediakan cara untuk tumpukan dengan banyak web node untuk memiliki satu sumber otoritatif gambar tanpa harus berurusan dengan NFS mounts.

Jika Anda seperti saya, dan jalankan penyebaran dengan mengganti node web masuk dan keluar dari penyeimbang beban (seperti menggunakan AWS Launch Configurations / Auto Scaling Groups), ini sebenarnya cukup waras.

Biasanya Anda ingin menghindari menempatkan gambar dalam DB karena berbagai alasan, tetapi cara proses ini (pada dasarnya) bekerja adalah gambar ditarik ke sistem file lokal dari DB, dan kemudian disajikan dari sana untuk permintaan berikutnya .

Jika Anda dapat mengambil langkah lebih jauh (jadi ada lebih sedikit permintaan untuk menarik gambar ke bawah / referensi dari sistem file) Saya akan merekomendasikan menggunakan CDN dan mengatur situs web Anda sebagai asal, dan mengubah URL media seperti yang dijelaskan oleh orang lain.

Sebagai tambahan, sebagian besar konfigurasi MySQL akan memiliki nilai "max_allowed_packet" yang sangat rendah yang membatasi ukuran transfer data yang diizinkan untuk DB Anda. Jika Anda berencana untuk menyimpan gambar di DB, Anda mungkin ingin memeriksanya sehingga Anda tidak menembak kaki sendiri.

Jason Rose
sumber