为什么CodeIgniter的Curl库比在PHP中使用Curl慢?

时间:2012-10-16 03:43:47

标签: php codeigniter curl performance

最近我将使用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();
}
non codeigniter(plain 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解析器??

2 个答案:

答案 0 :(得分:2)

我不确定我知道确切答案,但我对Curl& amp; CI,因为我广泛使用它。

  1. 检查DNS缓存/查询的状态。
  2. 当代码从我的开发桌面上传到托管登台服务器时,我注意到了大幅加速。它被追溯到通过重新启动堡垒主机解决的DNS问题...您有时可以通过使用IP地址而不是主机名来检查这一点。

    1. 菲尔的'图书馆'实际上只是一个包装。
    2. 他所做的一切都是将CI风格的函数映射到PHP Curl库。几乎没有其他事情发生。我花了一些时间四处寻找(我忘了为什么),这真的很不起眼。也就是说,可能会有一些一般的CI开销 - 你可能会看到在另一个类似的框架(Fuel,Kohana,Laravel等)中会发生什么。

      1. 检查反向查询。
      2. 某些API会将DNS检查作为其安全扫描的一部分进行反向检查。有时主机名或其他标题在埋藏的配置中被严重设置并且可能导致真正的麻烦。

        1. 使用Chrome的Postman扩展程序调试REST API。
        2. 没有评论,这很精彩 - https://github.com/a85/POSTMan-Chrome-Extension/wiki而且你对'对话'有着细致的控制。

答案 1 :(得分:0)

我必须更多地了解CI库,如果它正在对收集的数据执行任何额外的任务,但我会尝试将您的方法命名为库名以外的其他内容。我在Facebook库中遇到问题,在名为facebook的方法中调用它会导致问题。如果你在讨论图书馆或方法,那么$ this-> curl可能会有些模棱两可。

另外,尝试添加调试分析器并查看它的用途。在构造或方法中添加:

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