1

ローリング カールを使用して、他の 40 の Web サイトからデータを取得しています。Web サイトで結果が利用可能になるとすぐに、チャンクを使用してすぐに送信されます。

それを実装するために、次のヘッダーを追加しました:-

header("Transfer-encoding: chunked");
flush();

また、関数を使用してチャンクを出力しました:-

function print_chunks($chunk){
    $chunk = json_encode($tempArray);
    echo sprintf("%x\r\n", strlen(($chunk)));
    print_r($chunk);
   echo "\r\n";
   flush();
}

私の場合、すべてのチャンクは JSON 形式のデータであり、そのサイズはゼロ以外の任意の値にすることができます。

クライアント側では、これを使用して応答を処理しています:-

xml.onprogress = function () {
alert("Triggered");
}

これは、約 40 回の呼び出しに対して 2 回だけトリガーされます。実際に送信される前に、多くの応答がマージされていると思います。これは、結果が個別に送信されるのではなく、すべての結果が送信された後にのみ送信されるため、パフォーマンスが大幅に低下します。個々の応答のサイズが小さいためですか?

チェックアウトするチャンク データを送信する実際のハンドルを次に示します。

アップデート :

個々のチャンクの最小サイズに制約はありますか? 単純な小さな文字列チャンクのみを送信すると、すべてのチャンクが一緒に送信されます。

これは私が使用した完全なコードです。ここで 10 個のチャンクを作成したとしても、20 秒後にすべてをまとめます :-

<?php
header("Transfer-encoding: chunked");
flush();


function dump_chunk($chunk)
{
    echo sprintf("%x\r\n", strlen($chunk));
    echo $chunk;
    echo "\r\n";
    flush();
}

$string = "Hello World, This is chunk1";
$string1 = "Hello World, This is chunk2";
$string2 = "Hello World, This is chunk3";
$string3 = "Hello World, This is chunk4";
$string4 = "Hello World, This is chunk5";
$string5 = "Hello World, This is chunk6";
$string6 = "Hello World, This is chunk7";
$string7 = "Hello World, This is chunk8";
$string8 = "Hello World, This is chunk9";
$string9 = "Hello World, This is chunk10";
$string10 = "";

dump_chunk($string);
sleep(2);
dump_chunk($string1);
sleep(2);
dump_chunk($string2);
sleep(2);
dump_chunk($string3);
sleep(2);
dump_chunk($string4);
sleep(2);
dump_chunk($string5);
sleep(2);
dump_chunk($string6);
sleep(2);
dump_chunk($string7);
sleep(2);
dump_chunk($string8);
sleep(2);
dump_chunk($string9);
sleep(2);
dump_chunk($string10);

?>

疑問を質問する際に不明な点がある場合はコメントしてください。

4

1 に答える 1

1

flush()関数の最後にコンテンツをブラウザーにプッシュするために使用すると、print_chunks機能するはずです。

于 2013-01-09T22:01:57.320 に答える