Возможно, вы делаете это последовательно прямо сейчас. То есть выборка данных 1, данных процесса 1, данных выборки 2, данных процесса 2, ... и узким местом может быть передача данных.
Вы можете использовать curl_multi_exec () , чтобы немного распараллелить это.
Либо зарегистрируйте CURLOPT_WRITEFUNCTION и обработайте каждый фрагмент данных (хитро, поскольку md5 () работает только с одним фрагментом данных).
Или проверьте уже готовые маркеры скручивания, а затем обработайте данные этого маркера.
edit: быстрый и грязный пример с использованием расширения хэша (который предоставляет функции для инкрементных хэшей) и 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);
(хотя еще не проверял результаты ... это только отправная точка)