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)代码:

函数 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 有一些观察,因为我广泛使用它。

  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 回答