Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Алгоритм проверки


Автор: alligator 22.10.2014, 19:41
Всем привет, есть задача  отфильтровать ненужные ссылки в массиве:
критерием для проверки является наличие на сайте специального файла.... для примера: 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 банков одновременно
но к примеру если по первой ссылке файл не найден то проверить следующуюю ссылку , а если найден то остальные ссылки не проверять

Автор: baldina 22.10.2014, 23:09
ответ следующий либо проверка одновременно либо если первый не найден то проверить следующую.

ЗЫ. решение очевидно заключается в ожидании возвращаемого значения CURLM_OK, а не пока $active, и обработке того, что уже исполнилось

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)