热门标签 | 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;

}


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



   



推荐阅读
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 本文介绍了如何对PHP二维数组进行排序以及如何获取最大值。同时还提到了在数据分析系统中使用排序的实例,以及如何统计角色等级和创建角色总数。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
  • PHP中的curl_multi系列函数可以实现同时请求多个URL来实现并发,而不是像普通curl函数那样请求后会阻塞,直到结果返回才进行下一个请求。因此在批量请求URL时可通过curl_multi系列函数提升程序的运行效率。curl普通请求$startT ... [详细]
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社区 版权所有