如果我有三个获取参数:
$filename = $_GET['filename'];
$start = $_GET['start'];
$size = $_GET['size'];
我正在阅读文件的一大块:
$handle = fopen($basepath . $filename, "rb");
fseek($handle, $start);
$contents = fread($handle, $size);
echo md5($contents);
我如何读取文件的大部分(从1mb到1gb)并创建其内容的散列或校验和,而无需为整个读取分配足够的内存?
目前,如果我尝试散列文件的太大部分,我会收到内存错误,因为php无法分配足够的内存(大约400mb)。
是否有散列函数,我可以一次消化文件的一部分而不是一次消化整个内容(例如从$start
开始读取100kb块并将其提供给函数直到遇见$size
)?我将如何以块为单位读取文件,以便从$start
开始并读取$size
个字节?
如果没有这样的哈希或校验和功能支持一次提供数据块,会file_get_contents()
解决为大量读取分配内存的问题吗?我是不完全确定该功能是如何运作的。
感谢。
答案 0 :(得分:1)
http://php.net/manual/en/function.hash-update.php
<?php
define('CHUNK', 65536);
//$file = 'alargefile.img';
//$start = 256 * 1024 * 1024;
//$size = 512 * 1024 * 1024;
$fp = fopen($file, "r");
fseek($fp, $start);
$ctx = hash_init('md5');
while ($size > 0) {
$buffer = fread($fp, min($size, CHUNK));
hash_update($ctx, $buffer);
$size -= CHUNK;
}
$hash = hash_final($ctx);
fclose($fp);
print $hash;
?>