【问题标题】:Best practise for handling images in a CMS在 CMS 中处理图像的最佳实践
【发布时间】:2012-06-29 08:44:07
【问题描述】:

关于在 PHP/MySQL CMS 中处理图像的最佳实践的快速问题。每个项目将有不同数量的关联图像,这些图像将存储在项目 ID 引用的文件夹中。验证在上传时完成,因此所有文件都应该是有效的。 我的问题是我是否还应该将 ID 和文件名存储在数据库表中并从数据库中提取源数据,还是可以简单地遍历文件夹并直接插入源文件名?

我希望这是有道理的。提前感谢您的任何建议。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这在很大程度上取决于您想要多少故障点以及响应时间的速度。

    如果将其存储在文件系统中:

    1. 传入的 HTTP 请求
    2. PHP 查询数据库
    3. 数据库找到行
    4. PHP 破译查询响应
    5. PHP 读取文件
    6. PHP 发送文件的二进制内容作为对 HTTP 请求的响应

    但是,如果您将其作为二进制 blob 存储在数据库中:

    1. 传入的 HTTP 请求
    2. PHP 查询数据库
    3. 数据库找到行
    4. PHP 破译查询响应
    5. PHP 将二进制内容作为对 HTTP 请求的响应发送

    在这两种情况下,只要设置了正确的索引/键,第 3 步(数据库找到行)就可以与我们的 WITHOUT blob 列一样快。 MySQL 会在内部将指针移动到精确的索引位置——它实际上不会遍历每个字节,直到找到正确的字节(这是索引的全部点)。这与 PHP 手动读取文件一样耗时。但是,我目前没有支持性能数据来支持这一点。

    现在让我谈谈失败点:

    • 假设您迁移数据。如果您的二进制图像数据存储在数据库中,您只需移动数据库。但是,如果您的二进制图像数据存储在文件系统上,您必须记住移动两者。另请注意,迁移的 SIZE 将相同(或至少略有不同)。
    • 考虑重命名资产 - 您不仅要在数据库中重命名它,还要在文件系统中重命名它。这总共需要 2 个步骤,而不是在数据库中重命名它只有 1 个。
    • 考虑删除资产 - 您必须在两个位置都将其删除。

    出于可移植性、灵活性和最大程度地减少故障或损坏的目的,我一直将二进制数据作为 blob 存储在数据库中。

    如果您选择将文件作为 blob 存储在数据库中,请考虑不同的 blob 存储要求:http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html#id656744

    • TINYBLOB - 256 字节
    • MEDIUMBLOB - 64 KB
    • LONGBLOB - 4 GB

    最后,值得深思: 我有使用 Adob​​e's Day CQ 的经验,这是一个新兴的企业级内容管理系统。它主要是用 Java 编写的,但需要注意的是数据架构。它使用 JCR(Java 内容存储库),或多或少类似于多维 MySQL 数据库(有点酷?)。其 DAM(数字资产管理器)中的所有图像数据都存储为 JCR 中的一个节点。

    【讨论】:

    • 感谢您的详细回复,老实说,我决定不在数据库中存储实际的二进制数据。尽管您确实提出了一些我需要考虑的令人信服的论点。我在想的是将文件名存储在数据库表中,而不是单独使用项目的 id 来查找文件夹并简单地包含该文件夹中的所有图像。请原谅我的措辞混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多