2010-07-18 32 views
8

Tôi đã viết một tập lệnh đọc qua tất cả các tệp trong một thư mục và trả về băm md5 cho mỗi tệp. Tuy nhiên, nó không hiển thị gì cho một tệp khá lớn. Tôi giả định rằng trình thông dịch có một số giá trị được đặt cho thời gian xử lý tối đa và vì phải mất quá nhiều thời gian để có được giá trị này, nó chỉ bỏ qua cùng với các tệp khác. Có anyway để có được một md5 checksum cho các tập tin lớn thông qua PHP? Nếu không, nó có thể được thực hiện thông qua một công việc chron với cPanel? Tôi đã cho nó một shot ở đó nhưng nó không có vẻ như lệnh md5sum của tôi đã từng được xử lý: Tôi không bao giờ nhận được một email với băm. Đây là PHP tôi đã viết. Đó là một mã rất đơn giản và tệp công trình cho các tệp có kích thước hợp lý:Nhận MD5 Checksum cho các tệp rất lớn

function md5_dir($dir) { 
    if (is_dir($dir)) { 
     if ($dh = opendir($dir)) { 
      while (($file = readdir($dh)) !== false) { 
       echo nl2br($file . "\n" . md5_file($file) . "\n\n"); 
      } 
      closedir($dh); 
     } 
    } 
} 
+0

"Tệp khá lớn" là gì? Kích thước tệp là gì? –

+0

Lưu ý phụ: MD5 không phải là tổng kiểm tra, đó là một băm. Ngoài ra, nó không an toàn. –

+0

Tôi ngu ngốc giả định rằng công cụ md5 xuất ra tổng kiểm tra md5. XD Tôi đang cố gắng thực hiện tệp 1 gig. – fny

Trả lời

3

Trong khi tôi không thể tái tạo nó với PHP 5.2 hoặc 5.3 với tệp 2GB, vấn đề dường như xuất hiện trên bản dựng 32 bit PHP.

Mặc dù vậy nó không phải là một giải pháp thật sự tốt đẹp bạn có thể thử để cho hệ thống để các hasing

echo system("md5sum test.txt"); 

46d6a7bcbcf7ae0501da341cb3bae27c test.txt

+0

Không có gì xảy ra khi tôi chạy. – fny

+0

Tôi cho rằng bạn đang chạy Linux? Bạn đã thử trên bảng điều khiển và xem nó có hoạt động không? (Và nếu không có lỗi sẽ giúp bạn: /) – edorian

+1

Tôi đã chạy tập lệnh trên máy FreeBSD; do đó, không có GNU 'md5sum'. Cảm ơn vì tiền hỗ trợ. ;) – fny

2

Nếu bạn đạt đến giới hạn thời gian thực thi hoặc thời gian thực thi tối đa, PHP phải gửi thông báo lỗi đến hiệu ứng đó. Kiểm tra nhật ký lỗi của bạn. Nếu bạn đạt đến giới hạn, bạn có thể đặt giá trị tối đa cho việc sử dụng bộ nhớ PHP và thời gian thực thi trong tệp php.ini của bạn:

memory_limit = 16M 

sẽ đặt mức sử dụng bộ nhớ tối đa là 16 meg. Để có thời gian thực hiện tối đa:

max_execution_time = 30 

sẽ đặt thời gian thực hiện tối đa là 30 giây.

+0

[function.md5-file]: không thể mở luồng: Giá trị quá lớn cho loại dữ liệu được xác định – fny

2

bạn có thể đạt được điều đó với dòng lệnh

shell_exec('md5sum -b '. $fileName); 
+0

Có thể để các bạn để lại bình luận khi bạn downvote về các giải pháp? như đã nói ở faraz.yashar nhận xét rằng giải pháp php không hoạt động với số lượng lớn dữ liệu, dòng lệnh md5sum thực hiện. Tác giả nói rằng ông có thể đăng ký công việc cron, tôi giả sử anh ta cũng có thể chạy lệnh shell với php. – Benoit

+0

Bản thân tôi đã upvoted, nhưng tôi đoán rằng downvote là vì không có lời giải thích (ví dụ cho tham số '-b' .. –

2

FYI .... trong trường hợp ai đó cần có tổng kiểm tra nhanh md5(). PHP là khá nhanh ngay cả với các tập tin lớn hơn. Điều này trả về tổng kiểm tra trên Linux Mint .iso (kích thước 880MB) trong 3 giây.

<?php 
// checksum 
$path = $_SERVER['DOCUMENT_ROOT']; // get upload folder path 
$file = $path."/somefolder/linux-mint.iso"; // any file 
echo md5_file($file); 
?> 
Các vấn đề liên quan