Bir PHP uygulaması için bir veri katmanı olarak XML

4 Cevap php

Ben oldukça basit bir php web sitesi için bir XML veri katmanı yazma hakkında gitmek nasıl merak ediyorum. Bunun nedenleri şunlardır:

  1. db sunucu kullanılamıyor.
  2. Xml olarak ifade edilebilir basit veri şema.
  3. Ben sunucu bağımlılıklar olmadan, kendi kendine yeten bir uygulama olan fikir gibi.
  4. Ben belki başka projelerde yeniden kullanım için küçük bir çerçeve soyut isterim.

Şema birkaç arama tabloları artı i18n ile basit bir kitap katalog andırıyor. Yani, ifade etmek oldukça basittir.

Ana XML dosyası büyüklüğü 15MB için 100kb of aralığındadır. Ama ~ 100mb noktada büyümeye olabilir.

I am actually considering extending my model classes to handle xml data. Currently I fetch data with a combination of XMLReader and SimpleXml, like this:

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;
}

Yani, yerine bellekteki tüm xml dosyası yükleme, ben her bölüm için bir SimpleXMLElement nesnesi oluşturmak ve bu nesne üzerinde bir XPath sorgusu çalıştırın. Fonksiyon SimpleXML nesneleri dizisini döndürür. Muhafazakar arama için muhtemelen ilk bulunan madde üzerinde kıracak.

Ben sormak zorunda sorular şunlardır:

  1. Hatta büyük veri depolamak için bir ortam için kalıcı bir çözüm olarak bu düşünür müsünüz?
  2. Akılda tutulması gereken herhangi düşünceler / desenler, PHP XML işleme var mı?
  3. Mı büyük dosyalar için yukarıdaki kodu ölçek (100 mb)?
  4. Ekler ve büyük xml dosyaları güncellemeleri düşük havai bir şekilde ele alınabilir?
  5. Eğer daha iyi bir seçenek olarak alternatif bir veri formatı önerirsiniz?

4 Cevap

If you have a saw and you need to pound in a nail, don't use the saw. Get a hammer. (folk saying)

Bir veri deposu istiyorsanız, başka bir deyişle, bir veri tabanı değil, bir biçimlendirme dili kullanın.

PHP PDO yoluyla çeşitli veritabanı sistemleri için iyi bir destek var; küçük veri kümeleri için, bir sunucuya ihtiyaç duymaz SQLite'ı, (normal bir dosyada saklanır) kullanabilirsiniz. Daha sonra, tam özellikli bir veritabanına geçiş yapmak gerektiğinde, bu oldukça basit.

Sorularınızı cevaplamak için:

  1. Canlı çözüm - hayır, kesinlikle değil. XML kendi amaçları vardır, ancak bir veritabanı taklit bile değil, küçük bir veri kümesi için, bir değil.
  2. XML ile, her zaman etrafında dizeleri üreticimizin ediyoruz. Bu okuma sadece katlanılabilir, ama yazma gerçek bir kabus (yavaş, vb büyük bellek ayak izi ayrıştırmak için) olduğunu olabilir. Eğer bir veri deposu olarak çalışmak için XML yıkmak olsa da, sadece iş için yanlış bir araçtır.
  3. Hayır (Eğer daha önce bellek tükendi yoksa her şey, sonsuza kadar sürecektir).
  4. Hayır, birçok nedenden (yeniden bellek söz değil, bütün XML-string/file yeniden yazma, kilitleme) için.

5a. SQLite akılda çok küçük ve basit veritabanları ile tasarlanmıştır - basit, hiçbir sunucu bağımlılıkları (db bir dosya içerdiği). @ Robert Gould belirttiği gibi in a comment, daha sonra daha büyük ölçekli uygulamalar için, ama değil

5b. büyük veri depolamak için bir ortam için, bir ilişkisel veritabanı düşünün (ve bir veritabanına XML geçmek için daha da veritabanlarını geçmek için genellikle daha kolaydır).

Hayır, bu ölçek olmaz. Bu mümkün değil.

Sen mesela kullanarak daha iyi olurdu SQLite. Sen bir sunucuya ihtiyacınız yok, varsayılan ve normal dosyalarda saklar verilere göre PHP ile birlikte oluyor.

Ben küçük web siteleri ve x-kopyalama tarzı dağıtımlar için mükemmel olan, yerine SQLite ile gitmek istiyorum.

XML-tabanlı veri depolama iyi ölçeklendirme olmaz.

"SQLite nispeten küçük (~ 225 kB) C programlama kitaplıkta bulunan bir ACID uyumlu gömülü ilişkisel veritabanı yönetim sistemidir. SQLite için kaynak kodu kamu malı olduğunu.

Unlike client-server database management systems, the SQLite engine is not a standalone process with which the program communicates. Instead, the SQLite library is linked in and thus becomes an integral part of the program. It can also be called dynamically. The program uses SQLite's functionality through simple function calls, which reduces latency in database access as function calls within a single process are more efficient than inter-process communication. The entire database (definitions, tables, indices, and the data itself) is stored as a single cross-platform file on a host machine. This simple design is achieved by locking the entire database file at the beginning of a transaction."

Herkes XML dosyaları üzerinde kir atmak için seviyor, ama gerçekte çalışır, ben büyük uygulamalar onları kullanmak gördüm, ve ben depolama için basit flatfiles kullanan bir MMO biliyor ve MMO üst arasında olan (bu arada çalışıyor 5 dünya çapında) bu sadece bir oyuncak değil bu yüzden. Ancak benim işim şu anda SQL dayalı daha iyi ve daha savy kalıcılık katmanı oluşturmak ve sitenizin büyük SQL olacak eğer iyi çözümdür ama iyi yapılırsa XML Massive (MMO) ölçeklenebilirlik yeteneğine sahiptir.

Ama bir uyarı haritalama kolay değilse SQL XML göç kaba olmasıdır.