如何在PHP中“恢复 hash_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也没有提供恢复上下文的方法。
我想知道如何实现上述所有目标?
答案 0 :(得分:1)
只是想知道问题:也许你应该将接收过程与连接/散列过程分开。
初始化传输时,您的脚本可以启动在后台运行的持久脚本,等待块,计算每个可用块的哈希值,将它们附加到文件并在收到所有块时退出,所有这些都在一次执行中。
您的接收脚本只会将上传的块文件移动到临时目录,以使其可用于持久进程。