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

标签 php codeigniter curl performance

最近,我将使用 Curl 的抓取代码移至 CodeIgniter。我正在使用来自 http://philsturgeon.co.uk/code/codeigniter-curl 的 Curl CI 库.我将抓取过程放在一个 Controller 中,然后我发现抓取的执行时间比我用普通 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 解析器??

最佳答案

我不确定我是否知道这个问题的确切答案,但在我广泛使用 Curl 和 CI 时,我对它有一些观察。

  1. 检查 DNS 缓存/查询的状态。

当代码从我的开发桌面上传到托管暂存服务器时,我注意到速度有了显着提高。它被追溯到一个 DNS 问题,该问题通过重新启动堡垒主机得到解决......您有时可以使用 IP 地址而不是主机名来检查这一点。

  1. Phil 的“图书馆”实际上只是一个包装器。

他所做的只是将 CI 风格的函数映射到 PHP Curl 库。几乎没有其他事情发生。我花了一些时间四处闲逛(我忘了为什么),它真的很不起眼。也就是说,很可能会有一些一般的 CI 开销——您可能会看到在另一个类似的框架(Fuel、Kohana、Laravel 等)中发生了什么。

  1. 检查您的反向查找。

某些 API 会在其安全扫描过程中执行反向 DNS 检查。有时主机名或其他 header 在隐藏的配置中设置不当,可能会引起真正的麻烦。

  1. 使用 Chrome 的 Postman 扩展来调试 REST API。

没有评论,太棒了 - https://github.com/a85/POSTMan-Chrome-Extension/wiki并且您可以对“对话”进行精细控制。

关于php - 为什么 CodeIgniter 的 Curl 库比在纯 PHP 中使用 Curl 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12907234/

相关文章:

php - 使用 CodeIgniter 在表中显示数组结果时出现问题

php - 使用 PHP 执行 cURL 发送推送通知

javascript - Codeigniter 和 AJAX - 关闭编辑模式时重置/清除模式表单

php - 将结果重新调整为字符串

php - Python 中的 cURL 帮助

curl - 设置 cURL 使用本地虚拟主机

php - Codeigniter - 检查用户是否登录并存在(这是一个真实的用户)

php - 根据另一个 mysql 列中的 mysql 值求和 php 数组(从 mysql 结果创建)

php - 在 Laravel 中自动发送电子邮件

php - 向数据库提交下拉信息