() Hızlı md5_file yapmak için bir yolu?

7 Cevap php

Şu anda md5_file kullanın (); yaklaşık 15 URL'ler üzerinden çalıştırmak ve MD5 doğrulamak için. Ben bu hızlı yapabilirsiniz bir yolu var mı? Bu tüm bunların üzerinden çalıştırmak için çok uzun sürüyor. Bu iyi bir soru değilse özür dilerim, ben sadece onun sadece üç (dört bu bir sayarsanız) cümleler uzun gerçekleşmiştir.

7 Cevap

Probably you're doing it sequentially right now. I.e. fetch data 1, process data1, fetch data 2, process data 2, ... and the bottleneck might be the data transfer.
You could use curl_multi_exec() to parallelize that a bit. Either register a CURLOPT_WRITEFUNCTION and process each chunk of data (tricky since md5() works on exactly one chunk of data).
Or check for curl handles that are already finished and then process the data of that handle.

edit: hash extension (artan sağlamalarının için fonksiyonları sağlayan) ve kullanarak hızlı ve kirli örnek bir php5.3+ closure:

$urls = array(
  'http://stackoverflow.com/',
  'http://sstatic.net/so/img/logo.png',
  'http://www.gravatar.com/avatar/212151980ba7123c314251b185608b1d?s=128&d=identicon&r=PG',
  'http://de.php.net/images/php.gif'
);

$data = array();
$fnWrite = function($ch, $chunk) use(&$data) {
  foreach( $data as $d ) {
    if ( $ch===$d['curlrc'] ) {
      hash_update($d['hashrc'], $chunk);
    }
  }
};

$mh = curl_multi_init();
foreach($urls as $u) {
  $current = curl_init();
  curl_setopt($current, CURLOPT_URL, $u);
  curl_setopt($current, CURLOPT_RETURNTRANSFER, 0);
  curl_setopt($current, CURLOPT_HEADER, 0);
  curl_setopt($current, CURLOPT_WRITEFUNCTION, $fnWrite);
  curl_multi_add_handle($mh, $current);
  $hash = hash_init('md5');
  $data[] = array('url'=>$u, 'curlrc'=>$current, 'hashrc'=>$hash); 
}

$active = null;
//execute the handles
do {
  $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
  if (curl_multi_select($mh) != -1) {
    do {
      $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
}

foreach($data as $d) {
  curl_multi_remove_handle($mh, $d['curlrc']);
  echo $d['url'], ': ', hash_final($d['hashrc'], false), "\n";
}
curl_multi_close($mh);

(Bu sadece bir başlangıç ​​noktası olsa ... sonuçlarını kontrol değil)

Md5 algoritma oldukça fazla gibi hızlı olarak alabilirsiniz ve adresler getiriliyor (dosyalar çok büyük ya da yavaş bir bağlantınız varsa yavaş) oldukça fazla gibi hızlı olarak alabilirsiniz olduğunu. Yani hayır. Bunu hızlı yapamazsınız.

Eh tabii ki ancak, bazı hızlı kazanç elde etmek için bazı micro-optimizations veya kod yeniden faktoring kullanabilirsiniz, daha hızlı yapmak için md5_file() ile bir şey yapamaz ama yine yapabilirsiniz yerleşik bir işlevi hızlandırmak değil md5_file().

Hayır, bu bir daha hızlı yapmak için hiçbir yolu yoktur işlevi yerleşik olduğundan.

Kodunuzu onları MD5ing önce dosyaları indirirken Ama eğer, daha hızlı olmak için yüklemeleri optimize etmek mümkün olabilir. Ayrıca vaktinden boyutunu bilmek eğer yazmadan önce (ftruncate kullanarak) dosya boyutunu ayarlayarak küçük bir hız artışı görebilirsiniz.

Dosyalar bellekte tutmak için yeterince küçük ve (onlar indirilmiş, ya da başka bir amaç için okunuyor çünkü) zaten bunları bellekte varsa da, o bunu çalıştırmak için md5 kullanabilirsiniz belleği yerine md5_file o diskten yeniden okunabilir gerektirir.

Muhtemelen zaman bir süre içinde aynı URL'leri kontrol edilir? Eğer URL için son değiştirilme başlıklarını kontrol eder misiniz? Kontrol ediliyor sayfa değişmedi sonra MD5 yeniden hesaplamak gerek olmazdı.

Onlar paralel olarak işlenmiş olabilir bu yüzden de bunu hızlandırmak gerektiğini, hangi yerine seri daha, uyumsuz sayfaları talep edebilir.

MD5 algoritması hızı doğrusal değildir. Giriş daha büyük, daha fazla zaman alacaktır, bu nedenle dosya büyük ise, çok fazla yapabileceğiniz gerçekten orada değil.

VolkerK zaten önerildiği gibi Şimdi, sorun md5 karma ama almak ve net üzerinden dosya okuma değil büyük olasılıkla.

Ben optimize çok iyi bir öneri görmek here. Bu, özellikle md5_file dosyasını okuyor ve bu fonksiyon sadece her dosyanın ikinci bayt karşılaştırarak büyük dosyalar için iyi çalışacaktır.