2015-10-20 2 views
0

Если у меня есть три параметра ПОЛУЧАЮТ:Чтения больших частей файлов для хеширования/контрольных сумм

$filename = $_GET['filename']; 
$start = $_GET['start']; 
$size  = $_GET['size']; 

И я читаю кусок файла, как так:

$handle = fopen($basepath . $filename, "rb"); 
fseek($handle, $start); 
$contents = fread($handle, $size); 
echo md5($contents); 

Как я могу прочитать большим части файла (в любом месте от 1 мб до 1 гб) и создавать хэш или контрольную сумму его содержимого без необходимости выделять достаточное количество памяти для всего чтения?

На данный момент, если я попытаюсь использовать слишком большую часть файла, я получаю ошибку памяти, так как php не может выделить достаточно памяти (примерно 400 Мб).

Есть функция хеширования, в которой я могу переварить части файла, в то время, а не все содержимое сразу (например, начиная с $start чтения 100kb блоков и не кормить его функции до $size выполняется)? И как бы я прочитал файл в кусках, чтобы начать с $start и читать $size байтов?

Если нет такой хеширования или контрольная функция, которая поддерживает подавая куски частей данных в то время, бы file_get_contents() решить проблему выделения памяти для больших объемов чтения? Я не совсем уверен, как эта функция работает.

Спасибо.

+0

, Что цель получить хэш только часть файла? –

+0

Это часть сценария загрузчика, где клиентская часть может загружать HTTP-файл по частям и запрашивать хэш/контрольную сумму этой части файла для сравнения со стороны сервера. –

+0

Почему бы не разделить серверную сторону на zip или tar –

ответ

0

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; 
?> 
+0

Это именно то, что я искал, хотя я считаю, что есть ошибка в том, как вы читаете файл. Уменьшение переменной $ size по одному дает один и тот же хэш несколько раз подряд. Кроме того, установка '$ start' в 0 и' $ size' на размер файла дает неправильный хеш md5 по сравнению с 'md5sum'. Есть идеи? –

+0

Исправлено. Проблема заключалась в том, что «fgets» и, по-видимому, он останавливается на новых строках. Изменение его на 'fread' исправило проблему, и она функционирует так, как должна. Спасибо ~ –

+0

да, это 4 часа ночи здесь :(жаль, что это исправит – Sorin

Смежные вопросы