0

はじめに

現在、私は XML ファイルを扱っています。PHP を使用して、いくつかの XML ファイルを結合します。これは、PHP のデフォルトの memory_limit を超える大きな操作です。

致命的なエラーで制限を拡張するini_set('memory_limit', '1024M');と、スクリプトは制限を超えなくなりました。

私が今抱えている問題は、XML ファイルを結合した後、スクリプトにバグがあることです。ブラウザは無限に読み込まれますが、サーバー側ですべてを実行できます。自分自身に電子メールを送信するように、データベースに行を追加します。しかし、クライアント側のすべてが機能しません。単純なecho 'Hello World';またはのようにheader('location: http://www.google.com');

ファイルを結合しながら、手順を記録します。

$stores = $this->Store->getAll();
$this->log(2, 'all', 1337, 'Start processing ' . count($stores) . ' stores ';
foreach($stores as $store)
{
    $this->log(2, $store->id, 1337, 'Start processing store ';
    $this->process_store($store->id, false);
}
$this->log(2, 'all', 1337, 'Done with processing ' . count($stores) . ' stores ';
header('location: ' . BASE_URL . '/datatest');
die();

奇妙な部分は、私のスクリプトが最後のログを記録することDone with processingです。サーバーサイドで行うことはすべて機能します。

しかし、ヘッダー (リダイレクト) はそうではありません。私のブラウザは無限ロードです。

質問

  • 何がうまくいかないのですか?
  • ブラウザはしばらくするとサーバーとの通信を無効にしますか?
4

3 に答える 3

0

simpleXML を使用して再帰的な XML マージを行うことで、メモリの問題を回避できます。

コード

<?php
private function mergeXML(&$base, $add)
{
    $new = $base->addChild($add->getName());
    foreach ($add->attributes() as $a => $b) {
        $new[$a] = $b;
    }
    foreach ($add->children() as $child) {
        $this->mergeXML($new, $child);
    }
}?>

使用法

<?php mergeXML($xmlElement, simplexml_load_string($toMerge)) ?>

したがって、まず XML 1 を XML2 と結合して TempXML1 に結合し、次に TempXML1 と XML3 を結合する、というようにします。この方法では、すべてのファイルをメモリにロードすることなく、xml ファイルのリストをたどっていきます。

于 2012-11-09T11:57:44.260 に答える
0

本当に BASE_URL . 「/datatest」は正しい URL ですか? また、リダイレクトが適切に機能するように、Location に大文字の L を入力する必要があります。

最初にヘッダーのリダイレクトが機能することを確認するために、マージ全体を実行せずにこれを試してください。

于 2012-11-09T11:58:03.790 に答える
0

サーバーとクライアントが互いに切断されていることに気付きました。

最後に、本当に醜い解決策を見つけました!

sleep(1);サーバーとクライアントの接続を維持するには、 foreach ループ内にを設定する必要がありました。

ああ、これは以前よりも遅いです:'(

于 2012-11-13T15:34:50.960 に答える