2011-09-29 3 views
1

現実世界の問題:私はdinamicallyページを生成しています。このページは、ユーザーが取り出すxmlです(curl、file_get_contentsなど)。 ユーザーがリクエストをすると、彼は待機を開始し、データベースから大量のデータを取得し、xmlを構築し始めます(php domオブジェクトを使用)。いったん完了したら、print $ document-> saveXML()を実行します。この40メガバイトのドキュメントを作成するのに約8分かかります。それから私はページ/ドキュメントを提供する準備が整いました。今では60秒の接続タイムアウトを持つユーザーがいます。最初のオクテットを60秒ごとに送信する必要があると言いました。どのように私はそのようなことを達成することができますか?空のパケットを送信して接続をタイムアウトしないようにする

それは23987452行のコード原因誰もつもりはそれらを読んではありません投稿する無用なので、私は現実に非常に-擬似擬似コードとして、このページを提供するスクリプトを説明します:

  • グラブすべてDBからデータ:行
  • の膨大なセットが各列を通してのDOMDocument要素
  • ループを作成して、データの一部を含むことのDOMDocumentにノード要素を追加
  • コール$、DOM> saveXML()文書を文字列として取得する
  • それはXML文書であり、それはない台無しparser.`

    をし "<?xml..."で始める必要があるため、私は実際のデータを送信することはできません
  • ユーザーは、XML文書

1を取得するように、印刷文字列)

2)ユーザーは、私が対処することはできませんファイアウォール/ serverconfig

3)を扱うことができない私はのトップにのob_start()を使用してみました)

4「より強力なサーバーを購入」スクリプトを実行した後、各ループの開始時に"header("Transfer-Encoding: chunked"); ob_flush(); " しかし何もない:何も8分の前に来ない。

私を助けてください!

+0

あなたが行くにつれて出力するように、XMLを生成する必要があります。いずれか、またはバックグラウンドでファイルに出力し、準備ができたらファイルを提供します。 – Brad

+0

私は準備が整うと、そのファイルを提供しています。私はそれをチャンクなどで提供する必要があります。しかし、私はそれを出力することはできません:phpのdomdocumentクラスはオブジェクトであるため、saveXML()を呼び出すと、終了タグ付きのXMLが生成されます。 –

答えて

1

私は

  • は、ランダムな値

  • スタートバックグラウンド・プロセスとしてXML生成スクリプト

  • は生成スクリプトはにXMLを記述してください(hereなどを参照)を生成しますスクリプトが実行されたときにランダム値を名前として持つファイル

  • その空のファイルの存在を頻繁にポーリングします。 10秒ごとにAjaxリクエストを使用してそこに到着します。次に、ファイルからXMLをフェッチします。

+0

私はタイムアウトの問題を抱えていません。自分のコンピュータからページをフェッチしているユーザーに、相手側に何かを送る必要があります。 –

+1

@hysokaええ、私は理解しています。これは、タイムアウトのような種類を防ぐ必要があります –

+0

私はごめんなさいペッカ:私を助けてくれてありがとうが、私はまだそれを得ることができません。ウェブページではない:あなたはURLを使ってアクセスするが、明らかにブラウザは40MBのページを開くことができず、誰もブラウザによってこのファイルを取得しないだろう。彼らはfile_get_contents($ url)端末によって。だから何をすべきか? –

0

パディングを送信しても有効なXMLにしてください。簡単な例には、多くの場所の空白やコメントなどがあります。あなたがXML宣言を送信した後、あなたがコメントを開始することができ、およびパディングを送り続ける:

<?xml version="1.0"> 
<!-- this comment to prevent timeouts: 
    30 
    60 
    90 
    ⋮ 

または何を、正確なデータはない物質のコースありません。

これは簡単な解決策です。より良い解決策は、その世代をバックグラウンドで実行することです。たとえば、AJAXを使用して10秒ごとにサーバーをポーリングし、完了したかどうかを確認します。あるいは、別の通知方法を実装することもできます(たとえば、ドキュメントが準備ができたらURLをメールするなど)。

ブラウザにアクセスしていない場合は、簡単なAPIが必要になることがあります。ドキュメントの生成を開始するリクエストとドキュメントを取得するリクエストがあります。それをフェッチするユーザは、例えば、HTTPステータスコード500,503、または504などの「まだ準備ができていません」を返す可能性があります。次に、スクリプト要求は後で再試行する必要があります。 (たとえば、curlの場合、--retryオプションがこれを行います)。

+0

埋め込みは使用できません。 saveXML()関数を使用したスクリプト。終わりの前には何も印刷されておらず、何も印刷する必要はありません。ブラウザにアクセスするのではなく、ユーザーがポータルで、URLを取得してデータを取得する自動プロシージャがあり、ユーザーのサーバー側で変更できないものはありません。 HTTPステータスコード500を与え続けるとどうなりますか?リクエストは試し続けますか、curlを使用している場合は、あなたが言及したようなパラメータを使ってそれをesplictlyして言う必要がありますか? –

+0

@ hysoka44:あなたは確かにパディングを送ることができます。 'DOMDocument :: saveXML'は文字列を返します。したがって、生成する ''宣言を取り除き、代わりに独自の宣言を送ることができます。 'LIBXML_NOXMLDECL'フラグを試すこともできますが、それはうまくいかないかもしれません(ドキュメンテーションは矛盾しています)。 curlのデフォルトの動作に関しては、私は--retretryがデフォルトであるとは思わない。 – derobert

関連する問題