我想将Transfer-Encoding: chunked
标题添加到我正在输出的文件(它刚生成的纯文本),但是当我添加:
header("Transfer-Encoding: chunked");
flush();
浏览器不想打开文件。
......的网页可能是 暂时停止或可能已经移动 永久保存到新的网址。
我需要做些什么让它起作用?
答案 0 :(得分:4)
您需要向发送的每个块发送Content-Length
。查看Wikipedia第一印象,分块编码的样子。它不是那么微不足道,而且在很多情况下都是超大的。
更新:
首先发送标题,因为它们必须始终在任何内容之前发送(也使用分块编码)。然后发送(对于每个块)大小(十六进制),然后是内容。在每个块之后记住flush()
。最后,您必须发送一个零大小的块,以确保连接正确关闭。
它没有经过测试,但是像这样
header("Transfer-Encoding: chunked");
echo "5\r\n";
echo "Hello";
echo "\r\n\r\n";
flush();
echo "5\r\n";
echo "World";
echo "\r\n";
flush();
echo "0\r\n\r\n";
flush();
答案 1 :(得分:3)
正如之前的成员所说,你必须遵循分块传输编码格式。
在下一个例子中,我将展示如何使用一个用户功能来遵循格式规则:
<?php
//set headers
header('Transfer-Encoding: chunked');
header('Content-Type: text/html');
//browsers collect first 1024 bytes
//and show page only if bytes collected
//so we will use space padding.
//if you cannot understand what it means
//check script with PADDING=0
define("PADDING", 16);
//caret return and new line characters as constant
define("RN", "\r\n");
//user function what get current output buffer data
//and prefixes it with current buffer length.
//next it call flush functions
function flush_data(){
$str=ob_get_contents();
ob_clean();
echo dechex(strlen($str)).RN.$str.RN;
ob_flush();
flush();
}
//default HTML 5 page
echo "<!doctype html><html><head><title>Transfer-Encoding: chunked</title>";
echo "<script>";
//+padding
for($i=0;$i<PADDING;$i++){
//64 spaces (1 block)
echo " ";
}
echo "</script></head><body><div>";
//current output buffer will shown immediately in browser
//after this function
flush_data();
//cycle wait 1 sec before next iteration
for($i=0;$i<5;$i++)
{
//print iteration number
echo "$i<br>";
flush_data();
sleep(1);
}
echo "</div></body></html>".RN;
//terminating part of encoding format
flush_data();
echo "0\r\n\r\n";
ob_flush();
?>
备注强>:
答案 2 :(得分:1)
当我尝试使用&#34;转移编码:chunked&#34;我必须使用此代码才能使其正常工作:
<?php
echo "data";
header_remove("Transfer-Encoding");
flush();
?>
此代码仍然具有&#34;传输编码:chunked&#34;头。
当您使用flush时,它会自动设置Transfer-Encoding标题,但是当它手动设置时它会失败,因此要防止出现任何问题,请尝试将其删除。还要确保在执行第一次刷新之前删除行上的标题以防止错误。
答案 3 :(得分:-2)
在ob_flush();
flush();
示例代码:
<?php
header('Content-Encoding', 'chunked');
header('Transfer-Encoding', 'chunked');
header('Content-Type', 'text/html');
header('Connection', 'keep-alive');
ob_flush();
flush();
$p = ""; //padding
for ($i=0; $i < 1024; $i++) {
$p .= " ";
};
echo $p;
ob_flush();
flush();
for ($i = 0; $i < 10000; $i++) {
echo "string";
ob_flush();
flush();
sleep(2);
}
?>