php 大文件md5,php – 一种使md5_file()更快的方法?

可能你现在依次做这个.即获取数据1,进程数据1,提取数据2,进程数据2,…和瓶颈可能是数据传输.

您可以使用

curl_multi_exec()并行化一点.

要注册一个

CURLOPT_WRITEFUNCTION并处理每个数据块(因为md5()只在一个数据块上工作,这样很棘手).

或检查已经完成的卷曲句柄,然后处理该句柄的数据.

编辑:使用hash extension(提供增量散列函数)和php5.3+ closure:的quick& dirty示例:

$urls = array(

'https://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);

(没有检查结果,但它只是一个起点)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值