热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpcurl_multi携带cookie访问如何提升速度?

问题描述工作中需要curl一个链接,需要登录后才能返回关键字段。之前是直接curl,然后用保存后的cookie文件访问,但是每页只返回20条结果,而且太慢,每一次cur

问题描述

工作中需要curl一个链接,需要登录后才能返回关键字段。之前是直接curl,然后用保存后的COOKIE文件访问,但是每页只返回20条结果,而且太慢,每一次curl大概1s-1.3s,而且如果结果太多(最多50页),curl就会超时。




问题出现的环境背景及自己尝试过哪些方法

后面限制了页数,即如果返回页数大于5页只让其curl 5次,这样虽然不至于太慢了,但是结果也少了。后面了解了curl_multi ,自己也试了,如果不用COOKIE这个多进程确实快了很多,原来curl 25次 大概28秒,多进程之后大概2秒,但是一旦加上COOKIE访问,速度变得和普通curl一样了,甚至略慢一点。不知道是不是我哪里写的不对,附上代码

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
这个是普通curl
if($arr0['pcount']>1){



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
        $arr[0]['total']['pcount']=$arr[0]['total']['pcount']>10?10:$arr[0]['total']['pcount'];

        for ($i=2;$i<=$arr[0]['total']['pcount'];$i++){

            //带上COOKIE文件,访问

            $send_url='http://******.cn/ashx/GetList.ashx?pageIndex='.$i.'&keys='.htmlspecialchars($tj).'&Lx=3';

            $ch = curl_init($send_url);

            curl_setopt($ch, CURLOPT_HEADER, 0);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            //curl_setopt($ch, CURLOPT_COOKIEFILE, $COOKIE_file);

            curl_setopt($ch, CURLOPT_COOKIE, $COOKIE);

            $contents[] = curl_exec($ch);

            curl_close($ch);

        }

        $arr=array();

        foreach($contents as $k=>$v){

            $arr[$k]=(json_decode($v,true));

        }

    }

   

   

    //这个是调用curl_multi的

   

 if($arr[0]['total']['pcount']>1){

        $chArr=[];

        for($i=2;$i<=$arr[0]['total']['pcount'];$i++){

            $chArr[$i] = "http://*****.cn/ashx/GetList.ashx?pageIndex=$i&keys=".htmlspecialchars($tj)."&Lx=3";

        }

        $result = $this->postMulti($chArr,$COOKIE);

        $arr = array_merge($arr,$result);

    }

   

    //这个是curl_multi

    public static function postMulti($chArr,$COOKIE)

{

    $max_request = count($chArr);

    $ch_list = array();

    $multi_ch = curl_multi_init();

    for ($i = 2;$i <= $max_request+1;$i++) {

        $ch_list[$i] = curl_init($chArr[$i]);



        curl_setopt($ch_list[$i], CURLOPT_RETURNTRANSFER, true);

        curl_setopt($ch_list[$i], CURLOPT_COOKIE,$COOKIE) ;   //如果注释此行返回结果则很快

        curl_setopt($ch_list[$i], CURLOPT_TIMEOUT, 30);

        //curl_setopt($ch_list[$i], CURLOPT_COOKIEFILE, $COOKIE_file);

        curl_multi_add_handle($multi_ch, $ch_list[$i]);

    }



    $active = null;

    do {

        $mrc = curl_multi_exec($multi_ch, $active); //处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。

    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    //Note:

    //该函数仅返回关于整个批处理栈相关的错误。即使返回 CURLM_OK 时单个传输仍可能有问题。

    while ($active && $mrc == CURLM_OK) {

        if (curl_multi_select($multi_ch) != -1) {

            //阻塞直到cURL批处理连接中有活动连接。

            do {

                $mrc = curl_multi_exec($multi_ch, $active);

            } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        }

    }

    //获取http返回的结果

    $true_request = 0;

    foreach ($ch_list as $k => $ch) {

        $result[] = curl_multi_getcontent($ch);

        curl_multi_remove_handle($multi_ch,$ch);

        curl_close($ch);

        if ($result == 1) {

            $true_request += 1;

        }

    }

    curl_multi_close($multi_ch);

    foreach($result as $k=>$v){

        $arr[$k]=(json_decode($v,true));

    }

    return $arr;

}


你期待的结果是什么?实际看到的错误信息又是什么?



   



推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
author-avatar
欢不是欢7
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有