无状态增量文件哈希上下文恢复



简言之

如何在PHP中使用"resumehash_context"?


背景&现状

该软件的目标是逐块(同步)接收大文件,计算该文件的MD5和SHA1,并生成(完整文件的)下载链接。类似于rapidshare,但不是完全发送文件,而是逐块发送文件。

目前,软件正在使用以下逻辑:
它在每个文件会话中同步接收文件块(一个大文件的10MB块)。在收到所有的块之后,我需要计算一个文件的MD5和SHA1,对于1GB以上的文件来说,这需要很长的时间。

文件终结器的伪代码(当接收到所有块时):

$fileKey = $_GET['KEY'];
$ctxMd5 = hash_init('md5');
$ctxSha1 = hash_init('sha1');
$fh = fopen('file/containing/all_chunks.tmp', 'r');
while(!feof($fh)) {
$data = fread($fh, CHUNK_SIZE);
    hash_update($ctxMd5, $data);
    hash_update($ctxSha1, $data);
}
$md5 = hash_final($ctxMd5);
$sha1= hash_final($ctxSha1);
saveFileHashes($fileKey, $md5, $sha1);

问题是,当所有的区块都被上传时,用户必须等到脚本计算出两个散列,这非常令人沮丧。


问题的解决方案

我想以这种方式更改接收逻辑:
我不想在接收并保存所有区块时计算哈希,而是想恢复或创建新的哈希上下文,增加上下文,保存哈希上下文状态并保存文件区块,当接收到每个区块时

块接收器的伪代码:

$chunkData = getIncommingChunkData();
$fileKey = $_GET['KEY'];
$ctxMd5 = resumeMd5HasingContext($fileKey);
$ctxSha1 = resumeSha1HasingContext($fileKey);
hash_update($ctxMd5, $chunkData);
hash_update($ctxSha1, $chunkData);
saveMd5HashingContext($fileKey, $ctxMd5)
saveSha1HashingContext($fileKey, $ctxSha1)
appendFileChunk($fileKey, $chunkData);

问题

主要问题是PHP资源不可序列化,hash_init也不提供恢复上下文的方法。

我想知道如何实现上述所有目标?

这只是解决问题的一个想法:也许您应该将接收过程与级联/哈希过程分开。

初始化传输时,脚本可以启动一个在后台运行的持久脚本,等待块,计算每个可用块上的哈希,将其附加到文件中,并在接收到所有块时退出,所有这些都在一次执行中完成。

您的接收脚本只需将上传的区块文件移动到一个临时目录中,使其可用于持久进程。

最新更新