为什么要创建get.php和/或`core / file_storage_database`?


12

从1.5或1.6版本开始,Magento在根文件夹中有一个名为的文件get.php。使用该core/file_storage_data模型,该文件允许Magento系统所有者直接从数据库中的blob列提供其产品媒体文件,无需在文件系统上放置映像文件。PHP处理文件发送

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

这正在进入Magento历史领域,但是为什么开发了此功能?似乎-有点发疯。PHP并不是提供文件的最有效方法,MySQL的Blob存储具有不稳定的历史,甚至稳定的数据库Blob实现也很难在后面使用,而且据我Varien_File_Transfer_Adapter_Http所知这些文件的所有缓存头。

有谁知道为什么Magento开发此功能?它实际上完成了要解决的任何目标/问题吗?有人在用吗?

Answers:


12

我实际上找到了此功能的原始SRS,可以出于历史目的在此处共享:

当前没有其他选择来存储媒体,而是存储在Web服务器的文件系统中。当只有一个系统实例在运行并且数据库与该系统实例位于同一服务器上时,这种方法就足够了。

但是,最可能的系统部署方式并不相同。客户在不同的服务器上部署了多个系统实例,这些实例需要同步。这就是为什么要开发两种不同的图像存储选项:数据库和CDN(内容交付网络)。

CDN作为备用媒体存储将仅在系统中作为支持选项实现,而不是与特定CDN的完全集成。管理员必须自己选择和配置CDN,以及在系统配置中进行较小的更改。

我不会粘贴用例,但对于CDN,它仅提及将图像/皮肤的基本URL更改为CDN URL(我假设它需要PULL CDN)


3

我没有对其进行广泛的测试,也没有在生产中使用它,但是将其用于我的Elastic Beanstalk + Magento指南。好处是没有共享的Web节点集群-图像文件通过admin上传后存储在数据库后端中,然后从那里开始提供服务(最好从那以后从CDN提供)。这意味着您可以避免使用NFS共享媒体。


2

我的猜测是,它适用于群集环境。具有1个db节点的多个webnode。如果会话/缓存也位于数据库(或其他节点)中,则您的Web节点将是只读的,并且每次启动新的Web节点时都不必同步媒体。

总的来说,我同意这看起来像是一种工程解决方案,正在寻求解决的问题。


2

我个人很高兴在Magento中看到这一点,因为(正如其他人所提到的那样)它为具有多个Web节点的堆栈提供了一种具有单一权威图像源的方式,而不必处理NFS挂载。

如果您像我一样,并且通过将Web节点替换入负载平衡器或从负载平衡器中替换Web节点来运行部署(例如,使用AWS Launch Configurations / Auto Scaling Groups),则实际上是非常明智的。

通常,出于各种原因,您都希望避免将图像放入数据库中,但是此过程(基本上)的工作方式是将图像从数据库中拉到本地文件系统上,然后从那里提供服务以进行后续请求。

如果您可以更进一步(因此从文件系统拉取/引用图像的请求更少),我建议您使用CDN并将您的网站设置为来源,并按照其他人的描述更改媒体URL。

附带一提,大多数MySQL配置的“ max_allowed_pa​​cket”值都非常低,这限制了允许传输到数据库的数据大小。如果您打算将图像存储在数据库中,则可能需要检查一下,以免打伤自己。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.