我有许多在Amazon S3上的LZO压缩日志文件,想要用PHP读取。AWS SDK提供了一个很好的 StreamWrapper,可以高效地读取这些文件,但由于文件被压缩了,我需要在处理之前对内容进行解压缩。
我安装了 PHP-LZO 扩展程序,它允许我执行
我安装了 PHP-LZO 扩展程序,它允许我执行
lzo_decompress($data)
,但由于我处理的是流而不是完整的文件内容,所以我认为我需要一次消耗一个LZO压缩块的字符串。换句话说,我想做到这样:$s3 = S3Client::factory( $myAwsCredentials );
$s3->registerStreamWrapper();
$stream = fopen("s3://my_bucket/my_logfile", 'r');
$compressed_data = '';
while (!feof($stream)) {
$compressed_data .= fread($stream, 1024);
// TODO: determine if we have a full LZO block yet
if (contains_full_lzo_block($compressed_data)) {
// TODO: extract the LZO block
$lzo_block = get_lzo_block($compressed_data);
$input = lzo_decompress( $lzo_block );
// ...... and do stuff to the decompressed input
}
}
fclose($stream);
这两个TODO
是我不确定该怎么做的:
- 检查数据流以确定是否已经有完整的LZO块
- 提取该块进行解压缩
由于压缩是由Amazon(s3distCp)完成的,因此我无法控制块大小,所以我可能需要检查传入的流以确定块的大小 - 这是一个正确的假设吗?
(理想情况下,我会直接在流上使用自定义StreamFilter,但我还没有找到任何已经这样做过的人)