2009-04-04 4 views
4

かなり単純なPHP WebサイトのXMLデータレイヤーの作成方法については、私は疑問に思っていました。その理由は次のとおりです。PHPアプリケーション用のデータレイヤーとしてのXML

  1. dbサーバーが利用できません。
  2. xmlで表現できるシンプルなデータスキーマ。
  3. 私は、サーバーに依存しない自己完結型のアプリケーションを持っているというアイデアが気に入っています。
  4. 私は、他のプロジェクトで再利用するために小さなフレームワークに抽象化したいと考えています。

スキーマは、いくつかのルックアップテーブルと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. より良い選択肢として代替データ形式を提案しますか?
+0

のXPathでXMLライブラリを使用して、あなた自身を書いていない、とあなたはちょうどあなたを読んでいる場合は、いくつかのXMLファイルを使用し、ハッシュとしてそれらにアクセスし、あなたは大丈夫、と –

+0

大丈夫ですデータを更新するのは苦しい(パフォーマンス上の)作業です –

答えて

5

あなたはのこぎりを持っていて、 のこぎりを使用していない、爪に ポンドに必要がある場合。ハンマーを取得します。(民俗ことわざ)他に

WO rds、データストアが必要な場合は、マークアップ言語ではなくデータベースを使用します。

PHPはPDOを使用してさまざまなデータベースシステムを良好にサポートしています。小規模なデータセットの場合、SQLiteを使用することができます.Siteiteはサーバーを必要としません(通常のファイルに格納されています)。後で、フル機能のデータベースに切り替える必要がある場合は、非常に簡単です。あなたの質問に答えるために

  1. 実行可能な解決策を - いや、間違いではありません。 XMLにはその目的がありますが、データベースをシミュレートすることは、小さなデータセットでは不可能です。
  2. XMLでは、文字列を常に前後に並べています。読んでも耐え難いかもしれませんが、書いてみると本当に悪夢です(解析が遅く、メモリの占有量が多いなど)。データストアとして機能するようにXMLを無効にすることはできますが、それは単に仕事にとって間違ったツールです。
  3. いいえ(それ以前にメモリが足りなくても、すべてが永久にかかります)。
  4. いいえ、多くの理由(ロック、XML文字列/ファイル全体の書き換え、メモリの再書き込みはしません)。

図5a。 SQLiteは非常に小さく単純なデータベースを念頭に置いて設計されています。シンプルでサーバ依存性はありません(dbは1つのファイルに含まれています)。 @Robertグールドはin a commentを指摘するように、それは大規模なアプリケーションのスケールが、その後

図5bはありません。中規模から大規模のデータストアでは、リレーショナルデータベースを検討してください(通常、XMLからデータベースに切り替えるよりもデータベースを切り替える方が簡単です)。

+0

あなたはそれが簡単だと思う:) XmlからSQLへの移行は壮大な痛みです! :) しかし、それはSqliteよりも優れており、XMLはフラットなスキーマに結びつかない。いくつかのモデルをマップする方が簡単です。だから私はそれを鋸と呼ぶのは公正だとは思わない。 SQLはソーにもなります。しかし、Qはどちらも鋸ではなく、ちょうど誇大宣伝を望んでいません –

+0

@Robert Gould:確かに、スキーマに関する十分な情報がありません。 SQLであらゆる種類のツリーを扱うのは難しいです。 – Piskvor

+0

スキーマに関係なく、あなたの答えを考えると、私はsqliteを試してみるべきだと思います。たぶん私は構成ファイルなどのためにXML処理コードを保管しておきます。 – dxrsm

3

代わりにSQLiteと表示されますが、これは小さなウェブサイトやx-copyスタイルの展開に最適です。

XMLベースのデータストレージは、拡張されません。

SQLiteのは、比較的小さい(〜225 KB)Cプログラミングライブラリに含まACID準拠埋め込みリレーショナルデータベース管理システムである。SQLiteのためのソースコードは、パブリックドメインにある。

クライアント/サーバーデータベース管理システムとは異なり、SQLiteエンジンはプログラムが通信するスタンドアロンプ​​ロセスではなく、リンクされてプログラムの不可欠な部分になります。単一のプロセス内の関数呼び出しとしてのデータベースアクセスの待ち時間を短縮する単純な関数呼び出しによるSQLiteの機能arプロセス間通信より効率的です。データベース全体(定義、表、索引、およびデータそのもの)は、単一のクロスプラットフォーム・ファイルとしてホスト・マシンに保管されます。この単純な設計は、トランザクションの開始時にデータベースファイル全体をロックすることによって実現されます。「

+0

データベース全体をロックすることは全くスケーラブルではありません。OSに伝える内容に応じてXMLファイルをロックするかどうかを指定できます –

4

いいえ、それは拡張できません。それは現実的ではないのです。

をあなたが例えばSQLiteを使用したほうが良いと思います。あなたは、サーバーを必要としない、それがデフォルトとデータを格納することにより、PHPでバンドルされています通常のファイルインチ

+0

Sqlite XMLはファイルベースであり、実際にはフラットXMLファイルのフォルダはSqliteよりもはるかに優れています。たとえあなたが何をしているのかわからなくても、実際にはより良いスケールになります。クラスタ化されたDB上でXMLファイルを使用するのではなく、スケーラビリティのためにsqliteに勝る –

+0

SimpleXMLとSQLiteのベンチマークがあるところにURLを貼り付けることができますか? – vartec

+0

いいえ、私は電話をしていますが、Sqliteはデータベースをロックしているので、実際には2つのクライアントを一度に処理することはできません。 2つのセッションを並行して実行することはできず、ボトルネックのための単一のポイントになります。 Sqliteは1対1の性能を発揮しますが、XMLのスケーラビリティは向上します –

2

誰もがXMLファイルに汚れを落とすのが大好きですが、実際には動作しますが、大規模なアプリケーションで使用されていますが、ストレージ用に単純なフラットファイルを使用するMMOについて知っています。世界でトップ5に入るので、それは単なるおもちゃではありません)。しかし、今私の仕事はSQLに基づいてより良い、より賢い永続性レイヤーを作成することです。あなたのサイトが大きなSQLの場合は最適なソリューションですが、うまくいけばXMLはMassive(MMO)スケーラビリティが可能です。

ただし、マッピングが容易でない場合、XMLからSQLへの移行は荒いです。

+0

"XMLはbaaadです"というわけではありません。一部のタスクはXMLに適しており、一部はデータベースに適しており、一部は全く異なるものに適しています。もちろん、鋸で釘を打ったり、釘打ち用の高性能特殊鋸を作ることもできますが、ハンマーを使う方がはるかに簡単です。 – Piskvor

+0

あなたは何かヒント/参考文献を持っていますか...それをうまくやっていますか? – dxrsm

+0

はい、実際は動作します。私はXSLTを多用していますので、XML形式でデータを取得する必要があります。ウェブサイトが十分に小さく(データモデルもあまり複雑ではない)、私はXMLを全部使います。 –

関連する問題