Nell'attesa che qualcuno mi illumini ho generato questo codice ...
Sembra andare ma non ne sono per niente convinto spero che qualcuno abbia la pazienza di
analizzare la cosa anche perche' sta roba e' documentata pochissimo.
Sto arrancando ...
Due note la mia intenzione e' quella di fare piu richieste parallele su diversi server ma al massimo una per server.
Codice PHP:
<?php
$urls = array (array("http://www.google.it/",
"http://www.google.it/search?hl=it&q=pippo&btnG=Cerca&meta=",
"http://www.google.it/search?hl=it&q=pluto&btnG=Cerca&meta="),
array("http://www.altavista.com/",
"http://www.altavista.com/web/results?itag=ody&q=prova&kgs=1&kls=0",
"http://www.altavista.com/web/results?itag=ody&q=pluto&kgs=1&kls=0"),
array("http://www.yahoo.com/",
"http://it.search.yahoo.com/search?p=prova&fr=yfp-t-501&ei=UTF-8&rd=r1",
"http://it.search.yahoo.com/search?p=pluto&fr=yfp-t-501&ei=UTF-8&rd=r1"));
$numServer = count ($urls);
$pointServer = array();
$result = array();
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i]=curl_init($url[0]);
$pointServer[$i] = 0;
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
curl_setopt($conn[$i],CURLOPT_FOLLOWLOCATION,1);
curl_setopt($conn[$i],CURLOPT_MAXREDIRS,2);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle ($mh,$conn[$i]);
}
$active = TRUE;
while ($active) {
while (($mrc = curl_multi_exec($mh, $active)) == CURLM_CALL_MULTI_PERFORM);
foreach ($conn as $i => $con) {
if (is_null($conn[$i])) {continue;}
if (curl_getinfo($con,CURLINFO_HTTP_CODE) != 0) {
$result[] = !curl_error($con) ? curl_multi_getcontent($con) : null;
curl_multi_remove_handle($mh,$con);
if ($pointServer[$i] < count($urls[$i])) {
$pointServer[$i] ++;
$conn[$i]=curl_init($url[$pointServer[$i]]);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
curl_setopt($conn[$i],CURLOPT_FOLLOWLOCATION,1);
curl_setopt($conn[$i],CURLOPT_MAXREDIRS,2);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle ($mh,$conn[$i]);
} else {
$conn[$i] = null;
}
}
}
}
foreach ($conn as $i => $con) {
if (is_null($conn[$i])) {continue;}
$result[] = !curl_error($con) ? curl_multi_getcontent($con) : null;
curl_multi_remove_handle($mh,$con);
}
curl_multi_close($mh);
print_r($result);
?>
Andrea
p.s. non e' scritto un gran che bene ma e' un test :P