【问题标题】:Performance Issues with Zipped Archives in PHPPHP 中压缩档案的性能问题
【发布时间】:2012-02-15 20:24:23
【问题描述】:

先介绍一些背景

我正在为一个新的 PHP Web 应用程序规划架构,并尝试使其尽可能易于安装。因此,我不在乎最终用户正在运行什么 Web 服务器,只要他们可以访问 PHP(将我的要求设置为 PHP5)。

但应用程序需要某种数据库支持。我决定使用嵌入式解决方案,而不是使用 MySQL。一些朋友推荐了 SQLite - 我可能仍然会朝那个方向发展 - 但我很犹豫,因为它需要 PHP 中的其他模块才能工作。

请记住,目标是易于安装...大多数外行用户不知道他们的服务器有哪些 PHP 模块,甚至不知道如何找到他们的 php.ini 文件,更不用说启用其他工具了。

我目前的目标

所以我目前倾向于使用基于文件系统的数据存储。 “数据库”将是一个文件夹,每个“表”将是一个特定的子文件夹,每个“行”将是该子文件夹中的一个文件。例如:

/public_html
    /application
        /database
            /table
                1.data
                2.data
            /table2
                1.data
                2.data

数据库中还有其他文件来定义架构要求、关系等。但这是我倾向于的基本结构。

我对 Microsoft 构建其 Open Office XML 文件格式 (.docx/.xlsx/etc) 的方式非常满意。每个文件实际上是一组定义文档的 XML 文件的 ZIP 存档。

它干净、易于解析、易于理解。

我想实际设置我的目录结构,使/database 真正成为驻留在服务器上的 ZIP 存档 - 一个单一的可移植文件。

但是随着数据存储大小的增长,这不会开始影响服务器的性能吗? PHP 是否需要将 整个 存档读取到内存中以提取它并读取其复合文件?

我可以使用哪些替代方法来实现这种文件结构,但仍使其尽可能可移植?

【问题讨论】:

  • From the manual: “从 PHP 5.3.0 起默认启用 SQLite3 扩展。”。 :)
  • 我想说,如果你按照自己的想法继续下去,然后遇到实际问题,你会学到最多的东西。但是,根据您的概述,我倾向于说您处理设计的方式非常错误。即使是在过去 10 年里有点追随你的格言的 wordpress,他们甚至是从 mysql 开始的。重新发明轮子然后抱怨这样做的坏处,你一定很疯狂。
  • MySQL 有自己的问题——最大的问题是它需要配置。非技术用户在安装“一键式”应用程序时会回避任何看起来像设置的东西。这就是为什么这么多人坚持使用像 GoDaddy 这样抽象配置步骤的 ****y 主机。

标签: php database zip


【解决方案1】:

从 PHP5 开始默认启用 Sqlite,所以大多数 PHP5 用户都应该拥有它。

我认为 zip 方法会有很多问题,例如将文件添加到相对较大的 zip 存档中非常耗时。我认为会有可怕的并发和锁定问题。

读取 zip 文件无论如何都需要 php 扩展,除非您使用纯 PHP 解决方案。缺点是大多数 php 解决方案都希望将整个 zip 读取到内存中,并且比用 C 编写并像 PHP 中的 zip 扩展一样编译的东西要慢得多。

我会选择另一种方法,或者要求 SQLite/MySQL。如果您使用 PDO for PHP,那么您可以允许用户选择 SQLite 或 MySQL,并且您的代码在发出查询方面没有什么不同。我认为 99% 以上的虚拟主机都支持 MySQL。

【讨论】:

  • MySQL 和 SQLite 的区别在于设置组件。但是由于每个人都一直告诉我 SQLite 支持 PHP5 开箱即用,我想它是安全的。我犹豫的是,尽管 PHP 手册声称,人们一直在告诉我关于其他模块(即 GD)的信息,并且一次又一次地错了。
  • 可以理解。 GD 有点不同,因为它通常默认启用,但有几个需要特殊包的外部依赖项(libpng、zlib、libjpeg、TTF 的 FreeType)。如果启用了gd,但系统没有freetype,那么特定系统就不能使用任何TTF函数,或者如果没有安装zlib,他们就不能写png图像等。我认为使用SQLite,你是安全一点。另请注意,SQLite3 在 PHP 5.3.0 中是默认的,从 PHP 5.0 开始启用 SQlite (2)。
【解决方案2】:

使用真实数据库也会影响您的性能。加载额外的模块是值得的(大多数 PHP 安装至少有 mysql 模块,可能还有 sqlite),因为这些模块是用 C 编写的,运行速度比 PHP 快得多,并且已经针对速度进行了优化。如果您愿意处理 sqlite BS,使用 sqlite 将有助于保持您的 Web 应用程序的可移植性。

【讨论】:

    【解决方案3】:

    Zip 存档非常适合数据交换。但是,它们不适合快速访问,而且不适合重写内容。这两者对于 Web 应用程序使用的数据库都非常重要。

    您提出的解决方案还存在一些特定的性能问题 - zip 存档中的文件列表在内部存储为“平面”列表,因此按名称访问文件需要 O(n) 相对于存档大小的时间.

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多