2012-10-16 2 views
6

最近、私はCurlでスクレイピングコードをCodeIgniterに移しました。私はhttp://philsturgeon.co.uk/code/codeigniter-curlからCurl CIライブラリを使用しています。私は掻爬プロセスをコントローラに入れて、私の掻き取りの実行時間が普通のPHPで構築したものよりも遅いことを発見しました。なぜCodeIgniterのCurlライブラリは、普通のPHPでCurlを使用するよりも時間がかかりますか?

CodeIgniterが結果を出力するのに12秒かかりましたが、普通のPHPでは6秒しかかかりませんでした。どちらも、HTML DOMパーサーによる解析プロセスを含んでいます。

はここで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(); 
} 

非CodeIgniterの(プレーンなPHP)コード:偽

関数カール($のURL、$バイナリ= falseの場合、$ポスト= 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); 

}

このCodeIgniterのカールが遅い理由を誰もが知っています?それともsimple_html_domパーサーですか?

+0

codeigniter以外のコードを投稿して、自分でテストすることはできますか? – Brendan

+0

ローカルマシンでテストしますか?同じサイズの同じデータをカールとコードネームのカールで送信しますか?あなたは100の接続でテストしますか? – Sergey

+0

はい同じデータとサイズのlocalhost xamppでテストしましたが、100接続でのテストはどういう意味ですか? –

答えて

0

私はCIライブラリについてもっと知っておく必要があります。収集されたデータに対して余分な作業を行っている場合は、メソッドにライブラリ名以外の名前を付けてみます。 Facebookの図書館でfacebookというメソッドで呼び出すと、問題が発生しました。 $ this-> curlは、あなたがライブラリやメソッドについて話している場合、あいまいかもしれません。

また、デバッグプロファイラを追加して、それがどのように表示されるかを確認してください。構築物または方法のいずれかでこれを追加します。

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

私はこのために正確な答えを知っているか分からないが、私は広範囲にそれを使用するように私はカール& CIについてのいくつかの観測を持っています。

  1. DNSキャッシュ/クエリの状態を確認します。

私の開発デスクトップからコードがホストされたステージングサーバーにアップロードされたとき、私はかなりのスピードアップに気付きました。要塞ホストを再起動することで解決されたDNSの問題を追跡しました...ホスト名の代わりにIPアドレスを使用することでこれをチェックすることができます。

  1. Philの「ライブラリ」は本当に単なるラッパーです。

本当にやったのは、PHPのCurlライブラリにCIスタイルの関数をマップすることでした。他には何も起こっていません。私は時間をかけて(なぜ私は忘れていた)それを掘り起こしました、そして、それは本当に印象的でした。つまり、一般的なCIのオーバヘッドがあるかもしれません。別の同様のフレームワーク(燃料、コナナ、ララベルなど)で何が起こるかを見ることができます。

  1. 逆引き参照を確認してください。

一部のAPIは、セキュリティスキャンの一環としてDNSチェックを元に戻します。時には、ホスト名やその他のヘッダーが埋め込まれた設定でひどく設定され、本当の頭痛を引き起こすことがあります。

  1. ChromeのPostman拡張機能を使用してREST APIをデバッグします。

コメントはありません。それは華麗です - https://github.com/a85/POSTMan-Chrome-Extension/wikiあなたは「会話」のきめ細かな制御を持っています。

関連する問題