使用分块传输编码来发送通过滚动Curl获得的数据

时间:2013-01-09 21:56:39

标签: php curl chunked-encoding

我正在使用滚动卷曲从其他40个网站获取数据。只要结果可用于网站,就会立即使用块发送它们。

为了实现这一点,我添加了以下标题: -

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次通话只触发两次。我想很多回复都会在实际发出之前合并。这会导致严重不良的表现,因为结果并非单独发出,而是仅在所有结果发出后才会发出。这是因为个别回复的规模较小?

Here是实际的句柄,用于发送分块数据以便签出。

更新:

单个块的最小大小是否有任何限制?如果我只发送简单的小字符串块,它会将所有块发送到一起。

这是我使用的完整代码。即使我在这里制作了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);

?>

如果我不清楚我是否怀疑,请发表评论。

1 个答案:

答案 0 :(得分:1)

使用flush()将内容推送到浏览器,在print_chunks功能的末尾,应该有效。