CURL ile sorun (Multi)

1 Cevap php

I curl_multi_*, ben, aldığı 1000 URL'ler diyelim, ve bir anda tüm bu URL'leri 5 işleyen bir sınıf / işlevi oluşturmak istediğiniz bir sorun yaşıyorum, yani bir URL indirirken tamamlandığında bu tahsis edecek henüz işlenmemiştir yeni bir URL'ye artık yuvası.

I some implementations curl_multi gördüğüm, ama bunların hiçbiri çözüm curl_multi_select kullanımında yerde yatıyor inanıyorum, bana ne istediğinizi yapmak için izin verir ama belgeleri çok net değildir ve kullanıcı notları çok yardımcı olmamaktadır.

Herkes böyle bir özelliği hayata nasıl bazı örnekler ile bana verebilir misiniz?

1 Cevap

İşte bunu yapmanın tek bir yolu var. Bu komut dosyası, bir anda adresler herhangi bir sayıda getir ve her bittiğinde (bu yüzden her zaman $maxConcurrent sayfalar getiriliyor oluyor) gibi bir yenisini ekleyecektir.

$sites = array('http://example.com', 'http://google.com', 'http://stackoverflow.com');
$concurrent = 2;   // Any number.

$mc = new MultiCurl($sites, $concurrent);
$mc->process();

echo '</pre>';

class MultiCurl
{
    private $allToDo;
    private $multiHandle;
    private $maxConcurrent = 2;
    private $currentIndex  = 0;
    private $info          = array();
    private $options       = array(CURLOPT_RETURNTRANSFER => true,
                                   CURLOPT_FOLLOWLOCATION => true,
                                   CURLOPT_MAXREDIRS      => 3,
                                   CURLOPT_TIMEOUT        => 3);

    public function __construct($todo, $concurrent)
    {
        $this->allToDo = $todo;
        $this->maxConcurrent = $concurrent;
        $this->multiHandle = curl_multi_init();
    }

    public function process()
    {
        $running = 0;
        do {
            $this->_addHandles(min(array($this->maxConcurrent - $running, $this->_moreToDo())));
            while ($exec = curl_multi_exec($this->multiHandle, $running) === -1) {
            }
            curl_multi_select($this->multiHandle);
            while ($multiInfo = curl_multi_info_read($this->multiHandle, $msgs)) {
                $this->_showData($multiInfo);
                curl_multi_remove_handle($this->multiHandle, $multiInfo['handle']);
                curl_close($multiInfo['handle']);
            }
        } while ($running || $this->_moreTodo());
        return $this;
    }    

    private function _addHandles($num)
    {
        while ($num-- > 0) {
            $handle = curl_init($this->allToDo[$this->currentIndex]);
            curl_setopt_array($handle, $this->options);
            curl_multi_add_handle($this->multiHandle, $handle);
            $this->info[$handle]['url'] = $this->allToDo[$this->currentIndex];
            $this->currentIndex++;
        }
    }        

    private function _moreToDo()
    {
        return count($this->allToDo) - $this->currentIndex;
    }

    private function _showData($multiInfo)
    {
        $this->info[$multiInfo['handle']]['multi'] = $multiInfo;
        $this->info[$multiInfo['handle']]['curl']  = curl_getinfo($multiInfo['handle']);
        //print_r($this->info[$multiInfo['handle']]);
        $content = curl_multi_getcontent($multiInfo['handle']);
        echo $this->info[$multiInfo['handle']]['url'] . ' - ' . strlen($content) . ' bytes<br />';
        //echo htmlspecialchars($content);
    }
}