第一部分背景
我正在计划一个新的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.
Zip归档非常适合数据交换。不过,它们不适合快速访问,而且对重写内容也很糟糕。对于web应用程序使用的数据库来说,这两者都非常重要。
您提出的解决方案还存在一些特定的性能问题——zip存档中的文件列表在内部存储为"平面"列表,因此按名称访问文件需要相对于存档大小的O(n)
时间。