如何解决HTTP流过滤器带有传输编码的convert.base64-encode:分块
我需要在从服务器到客户端的HTTP流上循环处理数百万条记录。因此,我取消了HTTP标头Transfer-Encoding = chunked的编写,并以这样的大小写了循环的每个元素:
$outputStreamResource = fopen('php://output','w');
header('Content-Type: application/octet-stream');
header('Transfer-Encoding: chunked');
// Write some content to $outputStreamResource before the loop
foreach ($recordStream as $record) {
// Output length of content in bytes
fwrite($outputStreamResource,sprintf('%x',mb_strlen($record,'8bit')));
fwrite($outputStreamResource,"\r\n");
fwrite($outputStreamResource,$record);
fwrite($outputStreamResource,"\r\n");
flush();
}
// Write some content to $outputStreamResource after the loop
// Send null byte to tell client,stream is finished
fwrite($outputStreamResource,'');
fclose($outputStreamResource);
这很好,可以产生所需的输出流。
但是,现在我需要对整个循环的结果进行base64编码(不是每个记录都单独记录)。我尝试使用PHP的内置stream filter base64-encode,如下所示:
$outputStreamResource = fopen('php://output','w');
header('Content-Type: application/octet-stream');
header('Transfer-Encoding: chunked');
// Write some content to $outputStreamResource before the loop
// Activate base64 for the entire record loop
$base64Filter = stream_filter_append($outputStreamResource,'convert.base64-encode');
foreach ($recordStream as $record) {
fwrite($outputStreamResource,$record);
flush();
}
// De-activate base64 and output the following content plainly
stream_filter_remove($base64Filter);
// Write some content to $outputStreamResource after the loop
// Send null byte to tell client,'');
fclose($outputStreamResource);
base64编码有效,但不是以带有块大小前缀的块格式进行的。任何想法如何实现这一目标?可以使用line-length
过滤器的参数convert.base64-encode
来手动分块输出。但是,这不会在每个结果块之前添加内容长度(以字节为单位)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。