XML作为PHP应用程序的数据层

时间:2009-04-04 12:39:44

标签: php xml

我想知道如何为一个相当简单的php网站编写XML数据层。原因是:

  1. 数据库服务器不可用。
  2. 可以用xml表示的简单数据模式。
  3. 我喜欢拥有自包含应用程序的想法,没有服务器依赖性。
  4. 我可能想把它抽象成一个小框架,以便在其他项目中重用。
  5. 该架构类似于一个简单的图书目录,其中包含一些查找表和i18n。因此,表达起来非常简单。

    主xml文件的大小在100kb到15mb的范围内。但它可能会在某种程度上增长到~100mb。

    我实际上正在考虑扩展我的模型类来处理xml数据。 目前我使用XMLReader和SimpleXml的组合来获取数据,如下所示:

    public function find($xpath){            
    
        while($this->xml_reader->read()){
    
            if($this->xml_reader->nodeType===XMLREADER::ELEMENT && 
               $this->xml_reader->localName == 'book' ){
    
    
                $node = $this->xml_reader->expand();
                $dom = new DOMDocument();
                $n = $dom->importNode($node, true);
                $dom->appendChild($n);
                $sx = simplexml_import_dom($n); 
    
    
                // xpath returns an array
    
                $res = $sx->xpath($xpath);
    
                if(isset($res[0]) && $res[0]){
    
                    $this->results[] = $res;                        
                }
        }
    
        return $this->results;
    }
    

    因此,我不是将整个xml文件加载到内存中,而是为每个部分创建一个SimpleXml对象,并对该对象运行xpath查询。该函数返回SimpleXml对象的数组。对于保守搜索,我可能会在第一个找到的项目上打破。

    我要问的问题是:

    1. 您是否认为这是一个可行的解决方案,即使对于中型到大型数据存储也是如此?
    2. 在PHP中处理XML时,是否需要记住任何注意事项/模式?
    3. 以上代码是否适用于大文件(100mb)?
    4. 可以低开销的方式处理大型xml文件中的插入和更新吗?
    5. 您是否建议使用其他数据格式作为更好的选择?

4 个答案:

答案 0 :(得分:5)

  

如果你有锯,你需要   砸钉子,不要用   锯。得到一把锤子。 (民间谚语)

换句话说,如果您想要数据存储,请使用数据库,而不是标记语言。

PHP通过PDO对各种数据库系统提供了很好的支持;对于小型数据集,您可以使用SQLite,它不需要服务器(它存储在普通文件中)。之后,如果您需要切换到功能齐全的数据库,这很简单。

回答你的问题:

  1. 可行的解决方案 - 不,绝对不是。 XML有其用途,但模拟数据库不是一个,即使对于小型数据集也是如此。
  2. 使用XML,你一直在改变字符串。这可能只是在阅读时可忍受,但在写入时是一个真正的噩梦(解析速度慢,内存占用空间大等)。虽然你可以颠覆XML以作为数据存储工作,但它只是工作的错误工具。
  3. 不(如果你之前的内存不足,一切都会永远消失。)
  4. 不,原因很多(锁定,重写整个XML字符串/文件,更不用说内存了)。
  5. 5a上。 SQLite的设计考虑了非常小而简单的数据库 - 简单,没有服务器依赖(db包含在一个文件中)。正如@Robert Gould指出in a comment,它不适用于较大的应用程序,但随后

    5b中。对于中型到大型数据存储,考虑一个关系数据库(通常更容易切换数据库而不是从XML切换到数据库)。

答案 1 :(得分:4)

不,它不会扩展。这不可行。

你最好使用例如SQLite。您不需要服务器,默认情况下它与PHP捆绑在一起,并将数据存储在常规文件中。

答案 2 :(得分:3)

我会选择使用SQLite,这对于小型网站和x-copy样式部署来说非常完美。

基于XML的数据存储无法很好地扩展。

SQLite 是一个符合ACID标准的嵌入式关系数据库管理系统,包含在一个相对较小的(~225 kB)C编程库中.SQLite的源代码属于公共领域。

与客户端 - 服务器数据库管理系统不同,SQLite引擎不是程序与之通信的独立进程。而是将SQLite库链接在一起,从而成为程序不可或缺的一部分。它也可以动态调用。该程序通过简单的函数调用使用SQLite的功能,这减少了数据库访问的延迟,因为单个进程中的函数调用比进程间通信更有效。整个数据库(定义,表,索引和数据本身)作为单个跨平台文件存储在主机上。这种简单的设计是通过在事务开始时锁定整个数据库文件来实现的。“

答案 3 :(得分:2)

每个人都喜欢在XML文件上沾沾自喜,但实际上它很有用,我见过大型应用程序使用它们,我知道一个MMO使用简单的平面文件进行存储并且工作正常(就像MMO的方式一样)在全球排名前5位,所以它不仅仅是一个玩具)。但是我现在的工作是基于SQL创建一个更好,更实用的持久层,如果你的站点很大,那么SQL是最好的解决方案,但如果做得好的话,XML能够实现大规模(MMO)可伸缩性。

但需要注意的是,如果映射不容易,则从XML迁移到SQL会很粗糙。