6

最近、Curl を使用したスクレイピング コードを CodeIgniter に移動しました。http://philsturgeon.co.uk/code/codeigniter-curlの Curl CI ライブラリを使用しています。スクレイピング プロセスをコントローラーに配置したところ、スクレイピングの実行時間がプレーンな PHP で作成したものよりも遅いことがわかりました。

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

CodeIgniter での私の Curl コードは次のとおりです。

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) コード:

function curl($url ,$binary=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);

}

この CodeIgniter Curl が遅い理由を知っている人はいますか?? それとも、simple_html_dom パーサーが原因でしょうか??

4

2 に答える 2

2

これについて正確な答えを知っているかどうかはわかりませんが、Curl と CI を広く使用しているため、Curl と CI についていくつかの観察があります。

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

開発デスクトップからホストされたステージング サーバーにコードをアップロードすると、大幅なスピードアップに気付きました。踏み台ホストを再起動することで解決された DNS の問題にたどり着きました...ホスト名の代わりに IP アドレスを使用して、これを確認できる場合があります。

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

彼が実際に行ったことは、CI スタイルの関数を PHP Curl ライブラリにマップすることだけです。それ以外のことはほとんどありません。時間をかけていろいろと調べてみましたが (理由は忘れました)、特に問題はありませんでした。とは言っても、一般的な CI オーバーヘッドが発生する可能性があります。別の同様のフレームワーク (Fuel、Kohana、Laravel など) で何が起こるかがわかります。

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

一部の API は、セキュリティ スキャンの一環としてリバース DNS チェックを行います。ホスト名やその他のヘッダーが埋もれた構成で不適切に設定されている場合があり、実際に頭痛の種になる可能性があります。

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

コメントはありません。素晴らしいです - https://github.com/a85/POSTMan-Chrome-Extension/wikiで、「会話」をきめ細かく制御できます。

于 2012-12-18T07:56:54.987 に答える
0

CI ライブラリについて詳しく知る必要があり、収集したデータに対して追加のタスクを実行している場合は、メソッドにライブラリ名以外の名前を付けてみます。Facebook ライブラリで、facebook という名前のメソッドで呼び出すと問題が発生するという問題がありました。ライブラリまたはメソッドについて話している場合、 $this->curl はあいまいになる可能性があります。

また、デバッグ プロファイラーを追加してみて、何が表示されるかを確認してください。これをコンストラクトまたはメソッドに追加します。

$this->output->enable_profiler(TRUE);
于 2012-11-07T23:18:29.827 に答える