如何解决链式处理数据流
在我的应用中,我需要生成相当大的 zip 存档,并出于安全原因将它们加密存储。
我找到了一种方法,可以使用流来减少所需的 RAM 量,并且到目前为止效果很好。我已将 ZipStream 的输出通过管道传输到 OpenSSL 进程调用,并使用以下代码为我提供了我想要的结果:
$cmd = "openssl enc -e -aes-256-cbc -K $myKey -iv $myIv -out $myFile";
$pipesStructure = [0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w")];
$process = proc_open($cmd,$pipesStructure,$pipes);
if (is_resource($process)) {
$zipOptions = new Archive();
$zipOptions->setOutputStream($pipes[0]);
$zip = new ZipStream('archive.zip',$zipOptions);
foreach($myFiles as $f) {
$zip->addFile($f->name,$f->content);
}
$zip->finish();
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
$return_value = proc_close($process);
}
现在,当我完成所有这些工作时,我想计算未加密的 zip 存档的哈希值。这个想法是插入一个额外的“处理块”,流将通过它:
[ ZipStream ] -----> [ Hash computing ] -----> [ Encryption ] ------> Final output
但到目前为止我还不能很好地理解流是如何工作的,而且我也没有做到这一点......
我很确定我需要使用 hash_init
、hash_update_stream
和 hash_final
,但我似乎无法将数据“馈送”到 hash_update_stream
。
我已经初始化了一个哈希上下文并在将所有文件添加到 zip 的循环之前添加了以下代码,希望 hash_update_stream
只会读取通过 $pipes[0]
的内容,但显然这不是方法
...
hash_update_stream($hashContext,$pipes[0]);
...
“最终确定”散列后,输出是空字符串 (''
) 的散列
关于如何进行的任何指示?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。