2012-10-16 12 views
6

Ostatnio przeniosłem swój skrobiący kod z Curl do CodeIgniter. Używam biblioteki Curl CI od http://philsturgeon.co.uk/code/codeigniter-curl. Wrzucam proces skrobania do kontrolera, a następnie stwierdziłem, że czas wykonywania mojego skrobania jest wolniejszy niż ten, który zbudowałem w zwykłym PHP.Dlaczego biblioteka Curl CodeIgniter jest wolniejsza niż użycie Curl w zwykłym PHP?

Zajęło 12 sekund, aby CodeIgniter wyprowadził wynik, podczas gdy w zwykłym PHP zajmuje to tylko 6 sekund. Oba obejmują proces analizowania z analizatorem DOM HTML.

Oto mój Curl kod w CodeIgniter:

function curl($url, $postdata=false) 
{ 
    $agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; 

    $this->curl->create($url); 
    $this->curl->ssl(false); 
    $options = array(
    'URL'    => $url, 
    'HEADER'   => 0, 
    'AUTOREFERER'  => true, 
    'FOLLOWLOCATION' => true, 
    'TIMEOUT'   => 60, 
    'RETURNTRANSFER' => 1, 
    'USERAGENT'  => $agent, 
    'COOKIEJAR'  => dirname(__FILE__) . "/cookie.txt", 
    'COOKIEFILE'  => dirname(__FILE__) . "/cookie.txt", 
); 

    if($postdata) 
    { 
    $this->curl->post($postdata, $options); 
    } 
    else 
    { 
    $this->curl->options($options); 
    } 

    return $this->curl->execute(); 
} 

non CodeIgniter (zwykły php) Kod:

funkcja curl ($ url, $ binarny = false $ post = false $ Cookie = false) {

$ch = curl_init(); 

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Accepts all CAs 
    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 2); 

    curl_setopt ($ch, CURLOPT_URL, $url); 
    curl_setopt ($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_REFERER, $url); 
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); 
    curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 60); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 



    if($cookie){ 


     $agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; 
     curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/cookie.txt"); 
     curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookie.txt"); 

    } 


    if($binary) 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 


    if($post){ 


     foreach($post as $key=>$value) 
      { 
     $post_array_string1 .= $key.'='.$value.'&'; 
     } 
     $post_array_string1 = rtrim($post_array_string1,'&'); 

     //set the url, number of POST vars, POST data 

     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_array_string1); 
    } 

     return curl_exec ($ch); 

}

Czy ktoś wie dlaczego to CodeIgniter Curl jest wolniejszy ?? a może to dlatego, że parser simple_html_dom?

+0

Czy możesz przesłać swój nieszyfrowy kod, aby przetestować go samodzielnie? – Brendan

+0

Czy testujesz na lokalnym komputerze? Czy wysyłasz te same dane o tym samym rozmiarze przez zwijanie i zwinięcie kodu? Czy testujesz przy 100 połączeniach? – Sergey

+0

Tak, przetestowałem na localhost xampp z tymi samymi danymi i rozmiarem, co oznacza test przez 100 połączeń? –

Odpowiedz

0

Musiałbym wiedzieć więcej o bibliotece CI i czy robi on dodatkowe zadania na zebranych danych, ale spróbowałbym nazwać twoją metodę czymś innym niż nazwa biblioteki. Miałem problemy z biblioteką na Facebooku, wywoływanie jej w metodzie o nazwie facebook powodowało problemy. $ this-> curl może być niejednoznaczne jeśli chodzi o bibliotekę lub metodę.

Spróbuj również dodać profiler debugowania i zobaczyć, co się stanie. Dodaj to zarówno w konstrukcji lub metody:

$this->output->enable_profiler(TRUE); 
2

Nie jestem pewien, wiem dokładną odpowiedź na to, ale mam kilka uwag o Curl & CI jak używam go intensywnie.

  1. Sprawdź stan pamięci podręcznej DNS/zapytań.

Zauważyłem znaczne przyspieszenie, gdy kod został przesłany na hostowany serwer pomostowy z mojego pulpitu programisty. Wyznaczono go na problem z DNS, który został rozwiązany przez ponowne uruchomienie hosta bastionu ... Czasem można to sprawdzić, używając adresów IP zamiast nazw hostów.

  1. "Biblioteka" Phila to tak naprawdę tylko opakowanie.

Wszystko, co naprawdę zrobił, to funkcje mapy w stylu CI do biblioteki Curl PHP. Niemal nic więcej się nie dzieje. Spędziłem trochę czasu, grzebiąc w kółko (nie pamiętam dlaczego) i to było naprawdę wyjątkowe. Powiedział, że może istnieć pewne ogólne obciążenie CI - możesz zobaczyć, co dzieje się w innych podobnych ramach (paliwo, Kohana, Laravel, itp.).

  1. Sprawdź swoje odwrotne wyszukiwanie.

Niektóre interfejsy API służą do przeprowadzania odwrotnych sprawdzeń DNS w ramach skanowania zabezpieczeń. Czasami hosty lub inne nagłówki są źle ustawione w ukrytych konfiguracjach i mogą powodować prawdziwe bóle głowy.

  1. Użyj rozszerzenia Listonosza Chrome do debugowania interfejsów REST API.

Bez komentarza, jest genialny - https://github.com/a85/POSTMan-Chrome-Extension/wiki i masz doskonałą kontrolę nad "rozmową".