1

わかりました、ここでスクリプトを依頼する時が来たと思います。

私は大きな配列を持っていて、それをループして、一定量になったら停止してからループを続けたいと思っています。スクリプトのサンプルは次のとおりです。

$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.
    }
}

print_r($result_array);

したがって、最初の配列は XML 応答からのものであり、場所と XML からの要求を使用して再度ループし、別の配列に再度ループしてから、最後の配列をループの外に出力したいと考えています。

しかし、配列が非常に大きいため、ここで問題が発生しています。配列がそれほど大きくない場合はうまくいきますが、大きくしたい場合はブラウザが停止するため、結果が得られません。

メモリをいじってみましたが、問題が解決しないので、配列を停止して出力し、ループを続行するのが最善の方法だと思いますが、方法がわかりません。

それを手伝ってください

ありがとうございました

4

2 に答える 2

1
echo str_repeat(' ', 4096); // you need this or something similar, because most of browsers don't print anything if they don't have enough to parse

foreach (...) {
...
    foreach (...) {
        ...
        print_r($result_array);
        flush(); // echo the buffer
    }
}

十分なデータを受信するまでブラウザが何も表示しないことがあります。そのため、str_repeat()があります。

PHPマニュアルから:

flush()は、Webサーバーのバッファリングスキームをオーバーライドできない場合があり、ブラウザのクライアント側のバッファリングには影響しません。[...]

mod_gzipのようなApacheのサーバーモジュールは、独自のバッファリングを実行する場合があります。これにより、flush()によってデータがクライアントにすぐに送信されなくなります。

ブラウザでさえ、表示する前に入力をバッファリングする場合があります。たとえば、Netscapeは、行末またはタグの先頭を受け取るまでテキストをバッファリングし、最も外側のテーブルのタグが表示されるまでテーブルをレンダリングしません。

一部のバージョンのMicrosoftInternetExplorerは、256バイトの出力を受信した後にのみページの表示を開始するため、これらのブラウザーにページを表示させるには、フラッシュする前に余分な空白を送信する必要があります。

コードを修正しようとしています:

echo str_repeat(' ', 4096);
$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.

        print_r($result_array);
        flush();
    }
}

このコードは、ループごとに$result_arrayを出力する必要があります。

于 2012-06-17T16:16:23.647 に答える
1

しかし、配列が非常に大きいため、ここで問題が発生しています。配列がそれほど大きくない場合はうまくいきますが、大きくしたい場合はブラウザが停止するため、結果が得られません。

実行タイムアウトに達しているように聞こえます(@Haroonが述べたように)。エラー ログを確認するか、リクエストがステータス 500 (Internal Server Error) で失敗したかどうかを確認することをお勧めします。

set_time_limit()を使用すると、実行タイムアウトを自由に (再) 設定できます。ただし、スクリプトが 30 秒 (実行タイムアウトの既定の設定) を超えて実行されている場合は、そのアレイを構築する別の方法を検討することをお勧めします。


foreach($locations as $loctn){
//Request of the XML,
$result = //A large array coming from a XML SOAP respond;

Web サービスからデータを取得しているようです。また、( 内の多数の項目の$locations場合) その Web サービスでかなりの数の要求を行っている可能性があるようにも思えます。

Web サービスへのアクセスが遅くなる場合があります。プロセスの外でそれを行う方法がある場合(「ジョブキュー」、cronジョブを使用したものなど)、それを実行してください。また、Web サービスによって提供されるデータをキャッシュして再利用できるかどうかも確認してください。

于 2012-06-17T16:27:18.307 に答える