Всем привет, есть задача отфильтровать ненужные ссылки в массиве: критерием для проверки является наличие на сайте специального файла.... для примера: http://url/test/1.xml
| Код | Array ( [1] => Array ( [info] => Array ( [name] => ЗАО ЮниКредит Банк [regnum] => 1 )
[urls] => Array ( [0] => http://kartaskidok.unicreditbank.ru [1] => http://m.unicreditbank.ru [2] => http://pda.unicredit.ru [3] => http://unicredit.ru [4] => http://unicreditbank.ru [5] => http://www.imbank.ru [6] => http://www.unicreditbank.ru [7] => http://www.unicreditgroup.ru [8] => https://enter.unicredit.ru )
)
[2] => Array ( [info] => Array ( [name] => ЗАО "КАБ "Викинг" [regnum] => 2 )
[urls] => Array ( [0] => http://viking.spb.ru )
)
[3] => Array ( [info] => Array ( [name] => Банк "Кредит-Москва" (ОАО) [regnum] => 5 )
[urls] => Array ( [0] => http://www.cmbank.ru [1] => http://www.eng.cmbank.ru [2] => http://www.plastilincard.ru [3] => http://www.plastilincards.com [4] => http://www.plastilincards.ru [5] => https://ibank.cmbank.ru )
)
|
Есть функция с эмуляцией много поточности curl которая проверяет N кол-во ссылок сразу и работает с массивом вида: 0 url 1 url 2 url
| Код | function UrlProcess($urls, &$result, $action){
$threads = $this->threads; $useragent = $this->all_useragents[array_rand($this->all_useragents)]; if(sizeof($urls)>0){ $i = 0; for($i=0;$i<count($urls);$i=$i+$threads) { $urls_pack[] = array_slice($urls, $i, $threads); } foreach($urls_pack as $pack) { $mh = curl_multi_init(); unset($conn); foreach ($pack as $i => $url) { $url=str_replace(array('http://','https://'),'',$url); $conn[$i]=curl_init(); $this->options[CURLOPT_URL]="http://".trim($url).$this->path; $this->options[CURLOPT_TIMEOUT]=$this->timeout; $this->options[CURLOPT_USERAGENT]=$useragent; $this->options[CURLOPT_CONNECTTIMEOUT]=$this->connect_timeout; curl_setopt_array($conn[$i], $this->options); curl_multi_add_handle ($mh,$conn[$i]); } do { $n=curl_multi_exec($mh,$active); usleep($this->tsleep); } while ($active);
foreach ($pack as $i => $url) { $response = curl_multi_getcontent($conn[$i]); $info = curl_getinfo($conn[$i]);
if($info['http_code'] and preg_match('/(<CredOrgDepRate(?:.+)>(?:.+)<\/CredOrgDepRate>)/is', $response) and !preg_match('/(body|html)/i', $response)){ if($action=='getrate') { $XML_Object=$this->XML2Object($response); $Org=$XML_Object->Org; $Org->addAttribute('Url', $url); $result[]=$XML_Object; //echo $url." - ".$XML_Object->Org->attributes()->RegNum."<br/>\r\n"; }
if($action=='check') { $result[]=$url; }
} else { // continue;//если xml не найден переходим к следующему сайту //echo $url."<br/>"; }//End of Bad Urls curl_multi_remove_handle ( $mh , $conn[$i] ); curl_close($conn[$i]); //curl_multi_close($mh); }//End of Check action } curl_multi_close($mh); }else{ exit ('Невозможно запустить проверку нет данных для обработки!'); } }
|
Так вот вопрос следующий какой алгоритм можно придумать чтобы проверять к примеру 30 банков одновременно но к примеру если по первой ссылке файл не найден то проверить следующуюю ссылку , а если найден то остальные ссылки не проверять |