PHP中压缩档案的性能问题


Performance Issues with Zipped Archives in PHP

第一部分背景

我正在计划一个新的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

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

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

它简洁、易于解析、易于理解。

我想实际设置我的目录结构,使/database实际上是一个驻留在服务器上的ZIP归档文件——一个单独的可移植文件。

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

我可以使用什么替代方案来实现这种文件结构,但仍使其尽可能具有可移植性?

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

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

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

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

使用真实的数据库也会影响性能。加载额外的模块是值得的(大多数PHP安装至少有mysql模块,可能还有sqlite),因为这些模块是用C编写的,运行速度比PHP快得多,并且经过了速度优化。如果您愿意处理sqlite BS.

,使用sqlite将有助于保持您的web应用程序的可移植性

Zip归档非常适合数据交换。不过,它们不适合快速访问,而且对重写内容也很糟糕。对于web应用程序使用的数据库来说,这两者都非常重要。

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