0

xml ファイルからワードプレスの投稿をインポートする小さなスクリプトを作成しました。

if(isset($_POST['wiki_import_posted'])) {

    // Get uploaded file
    $file = file_get_contents($_FILES['xml']['tmp_name']);
    $file = str_replace('&', '&', $file);

    // Get and parse XML
    $data = new SimpleXMLElement( $file , LIBXML_NOCDATA);

    foreach($data->RECORD as $key => $item) {

        // Build post array
        $post = array(
            'post_title' => $item->title,
            ........
        );

        // Insert new post
        $id = wp_insert_post( $post );
    }
}

問題は、xml ファイルが非常に大きいことです。フォームを送信すると、ブラウザが数分間ハングします。

すべてのアイテムがインポートされた後にドットを表示するなど、インポート中にいくつかのメッセージを表示することは可能ですか?

4

1 に答える 1

0

残念ながら、いいえ、簡単ではありません。特に、これをWPフレームワークの上に構築している場合は、しばらくの間はまったく価値がないことに気付くでしょう。PHPスクリプトを操作しているときは、要求を送信して応答を待っています。PHPスクリプトが処理を完了して出力の送信を開始するのにかかる時間は、通常、クライアントが応答の表示を開始するのにかかる時間です。

出力ができるだけ早く(つまり、最初のエコーまたは出力ステートメントに到達するとすぐに)表示を開始することが必要かどうかを検討することがいくつかあります。

  1. 出力がすぐに送信を開始するように、出力バッファリングをオフにします。
  2. 知りたい進捗状況を示すループ内に必要なものをすべて出力します。

AJAXリクエストでこれを行っている場合、コンテンツはXMLHttpRequestオブジェクトを介してDOMにすぐに転送する準備ができていない可能性があることに注意してください。また、一部のブラウザは、コンテンツをユーザーが表示できるようになる前に独自のバッファリングを行うことに注意してください(たとえば、IEなど)。

ただし、スクリプトを高速化するために検討する必要のあるいくつかの提案:

  • 大きなファイルでstr_replace('&'、'&'、$ file)を実行するのはなぜですか?あなたはそれが利益のないコストを持っていることに気づきますよね?何も達成しておらず、HTMLエンティティを置き換えたい場合&は、ロジックの一部が非常に間違っている可能性があります。エンコーディングは、XMLパーサーに処理させたいものです。
  • 大量のファイルを転送する場合は、file_get_contentsの代わりにcurl_multiを使用して、複数のHTTPリクエストを同時に実行し、時間を節約できます。I / Oをブロックしないため、はるかに高速になります。
  • SimpleXMLの代わりにDOMDocumentを使用する必要があり、DOMXPathクエリを使用すると、現在実行しているものよりもはるかに高速に配列を取得できます。SimpleXMLよりもはるかに優れたインターフェイスであり、SimpleXMLよりも優れていることを常にお勧めします。ほとんどの場合、SimpleXMLは非常に困難であり、正当な理由がないためです。名前にだまされてはいけません。
于 2013-01-01T18:23:14.163 に答える