一种让md5_file()更快的方法?

Rob*_*Rob 10 php md5 md5-file

我目前md5_file()用来运行大约15个URL并验证他们的MD5哈希值.有没有办法让我更快?贯穿所有这些需要太长时间.

Vol*_*erK 15

可能你现在正在顺序完成它.即获取数据1,处理数据1,获取数据2,处理数据2,......并且瓶颈可能是数据传输.
您可以使用curl_multi_exec()来进行并行化.注册CURLOPT_WRITEFUNCTION并处理每个数据块(因为md5()只适用于一个数据块).
或检查已完成的卷曲句柄,然后处理该句柄的数据.

编辑:使用散列扩展(提供增量散列函数)和php5.3 +闭包的快速和脏示例:

$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);
Run Code Online (Sandbox Code Playgroud)

(虽然没有检查结果......但这只是一个起点)

  • +1.并行化下载可能是一个巨大的胜利.实际上你也可以使用`md5sum` CLI命令(例如`exec('bash -c"md5sum file1> file1.md5&"')`)或者像PHP的pcntl_fork()之类的东西来并行化md5部分.分叉多次调用md5_sum().这些都有它们的缺点,但在正确的背景下,它们可能是最好的事情. (2认同)