ローリング カールを使用して、他の 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);
?>
疑問を質問する際に不明な点がある場合はコメントしてください。