1

如何在执行 php 脚本之前将标头发送到客户端?

我的脚本需要很长时间才能完成,而客户在此期间没有收到任何东西。

<?

header("HTTP/1.1 200 OK");
header("Date: Thu, 23 Jun 2011 10:16:31 GMT");
header("Content-Type: application/octet-stream");
header("Content-Length: 12275768");
header("Accept-Ranges: bytes");
header('Content-Disposition: attachment; filename="Untitled-1.bmp"');
header("Content-Transfer-Encoding: binary");
header("Connection: close");

//Send headers now

//because my php script take many time to finish
//because it downloads a file from a remote server

.
.
.

?>
4

4 回答 4

1

我不确定如何passthru工作以及命令的输出是否以某种方式缓冲。但这是另一个使用 的示例fopen,请求标头字段的流式上下文和带有显式刷新的分块传输编码:

header("HTTP/1.1 200 OK");
header("Date: Thu, 23 Jun 2011 10:16:31 GMT");
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header('Content-Disposition: attachment; filename="Untitled-1.bmp"');
header('Content-Transfer-Encoding: chunked');
header("Connection: close");

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);
$context = stream_context_create($opts);
$fp = fopen('http://www.example.com', 'r', false, $context);
while (($buffer = fread($fp, 512)) !== false) {
    echo sprintf("%X", strlen($buffer)), "\r\n", $buffer, "\r\n";
    flush();
}
echo "0\r\n\r\n";
flush();

确保使用ob_start或任何其他输出缓冲。

于 2011-06-23T12:43:35.913 回答
0

ob_flush()函数立即刷新输出缓冲区。你在寻找这样的东西吗?

于 2011-06-23T10:25:54.670 回答
0

使用ob_start()并输出一些东西,然后ob_flush;然后再输出一些,然后ob_flush再输出。

于 2011-06-23T10:30:52.333 回答
0

在您的 php 脚本中创建标题,开始编写 html 代码,然后刷新,并继续创建 HTML 的其余部分。

于 2011-06-23T10:36:35.497 回答