php抓取多个网页合并,PHP 使用 CURL 同步抓取多个网页

一般CURL 抓网页的方法, 是一页一页抓, 假设要抓 4页, 所费时间各别是 5,10,7,5 秒, 那全部总合所花的时间就是 5 + 10 + 7 + 5 = 27 秒。

若能同时间去抓取多个网页, 所花费的时间 5,10,7,5 秒, 全部总合所花的时间是 10 秒。(花费最多时间的秒数)

于JavaScript 可使用 AJAX 的 async(YAHOO.util.Connect.asyncRequest)来达成, 于 PHP 可以用 CURL 来达成此 Multi-Threading 的效果。

程序(async.php)

以下为引用的内容:

function async_get_url($url_array, $wait_usec = 0)

{

if (!is_array($url_array))

return false;

$wait_usec = intval($wait_usec);

$data    = array();

$handle  = array();

$running = 0;

$mh = curl_multi_init(); // multi curl handler

$i = 0;

foreach($url_array as $url) {

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect

curl_setopt($ch, CURLOPT_MAXREDIRS, 7);

curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里

$handle[$i++] = $ch;

}

/* 执行 */

do {

curl_multi_exec($mh, $running);

if ($wait_usec > 0) /* 每个 connect 要间隔多久 */

usleep($wait_usec); // 250000 = 0.25 sec

} while ($running > 0);

/* 读取资料 */

foreach($handle as $i => $ch) {

$content  = curl_multi_getcontent($ch);

$data[$i] = (curl_errno($ch) == 0) ? $content : false;

}

/* 移除 handle*/

foreach($handle as $ch) {

curl_multi_remove_handle($mh, $ch);

}

curl_multi_close($mh);

return $data;

}

?>

使用

以下为引用的内容:

$urls = array('http://example1.com', 'http://example2.com');

print_r(async_get_url($urls)); // [0] => example1, [1] => example2

?>

测试

sleep.php # 看时间延长取得的效果

以下为引用的内容:

sleep(intval($_GET['time']));

echo intval($_GET['time']);

?>

以下为引用的内容:

$url_array = array(

'http://example.com/sleep.php?time=5',

'http://example.com/sleep.php?time=10',

'http://example.com/sleep.php?time=7',

'http://example.com/sleep.php?time=5',

);

print_r(async_get_url($url_array));

// 总花费时间会是 10 秒, 并印出 [0] => 5, [1] => 10, [2] => 7, [3] => 5

?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多终端数据同步机制设计

多终端数据同步机制设计之前写过一篇文章数据同步流程设计的文章,这里整理一下在公众号里分享一下Intro因为项目需要,需要设计一个多终端数据同步的机制, 需要满足以下条件:多个终端数据操作及同步,终端可能离线每次同…

Popular Cows POJ - 2186(tarjan算法)+详解

题意: 每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎。这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认…

[设计模式]装饰模式

装饰模式: 通过AbstractEquipment装饰AbstractHero&#xff0c;使其heroA增加了一个穿装备的功能。 代码如下: #include <iostream> using namespace std;class AbstractHero {public:virtual void showStatus() 0;int hp;int mp;int at;int df; };class HeroA :publi…

ASP.NET Core分布式项目实战(Consent Controller Get请求逻辑实现)--学习笔记

任务20&#xff1a;Consent Controller Get请求逻辑实现接着上一节的思路&#xff0c;实现一下 ConsentController根据流程图在构造函数注入 IClientStore&#xff0c;IResourceStore&#xff0c;IIdentityServerInteractionService构造函数private readonly IClientStore _cli…

[设计模式]观察者模式

代码如下: #include <iostream> #include <list> using namespace std;class AbstractHero { public:virtual void update() 0; };class HeroA :public AbstractHero { public:HeroA(){cout << "英雄A正在打BOSS" << endl;}virtual void u…

oracle导出BOM文件,ORACLE ERP导数据(BOM清单)-备份恢复-Oracle频道-中国IT实验室

方法&#xff1a;把数据导入BOM清单的方法是&#xff0c;把数据导入接口表中&#xff0c;让其自动运行既可。上传文件的时候&#xff0c;要注意使 用ASCII字符模式。1、自己建立一中转表drop table cux_bill_temp;create table cux_bill_temp(bill_sequence_id number,as…

RMQ算法讲解

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/qq_41311604/article/details/79900893 </div><!--一个博主专栏付费入口--><!--一个…

Kubernetes是容器化微服务的圣杯么?

导语Kubernetes已成为山丘之王。开源技术Kubernetes以及随后的发行版正以超快的速度让人们爱上容器技术&#xff0c;并且开始夺回对容器化环境的控制权。不幸的是&#xff0c;编排容器只是战斗进行了一半。正文云服务提供商接连宣布他们的编排选择是Kubernetes私有发行版&#…

[设计模式]命令模式

代码如下: #include <iostream> #include <queue> #include <Windows.h> using namespace std;class HandleClientProtocol { public:void addMoney(){cout << "给玩家增加金币" << endl;}void addDiamond(){cout << "给玩…

oracle 附加日志 挂起,Oracle 附加日志(supplemental log)

附加日志(supplemental log)可以指示數據庫在日志中添加額外信息到日志流中&#xff0c;以支持基於日志的工具&#xff0c;如邏輯standby、streams、GoldenGate、LogMiner。可以在數據庫和表上設置。1.數據庫級設置&#xff0c;分兩類&#xff1a;1.1最小附加日志(minimal supp…

Zjnu Stadium HDU - 304 加权并查集

题意&#xff1a; 观众席围成一圈。列的总数是300&#xff0c;编号为1–300&#xff0c;顺时针计数&#xff0c;我们假设行的数量是无限的。将有N个人去那里。他对这些座位提出了要求&#xff1a;这意味着编号A的顺时针X距离坐着编号B。例如&#xff1a;A在第4列&#xff0c;X…

还不明白可空类型原理? 我可要挖到底了

一&#xff1a;背景1. 讲故事做好自媒体到现在有一个月了&#xff0c;关注我的兄弟应该知道我产出了不少文章&#xff0c;号里的粉丝也多起来了&#xff0c;我也尽最大努力做到有问必回&#xff0c;现在是基础的、高深的问题都接踵而来&#xff0c;可我也只是一只小菜鸟&#x…

[设计模式]策略模式

策略模式:定义了一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;而且使它们还可以相互替换。 策略模式让算法独立于使用它的客户而独立变化。 代码如下: #include <iostream> using namespace std;class WeaponStrategy { public:virtual void useWeapon()…

蜘蛛牌 HDU - 1584(搜索——达到先让某些段先结合,达最优解)

题意&#xff1a; 一排杂乱的牌&#xff0c;牌间距为1&#xff0c;每次移动只能将小的牌&#xff0c;移动到较大牌上&#xff0c;最终使得牌从小到大排好在一堆。问移动的最小距离。 题目&#xff1a; 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏&#xff0c;游戏规则是这…

oracle 启动实例配置,centOS 7配置单实例oracle自启动

1、修改/etc/oratab(oracle用户操作)vi /etc/oratabtestdb:/u01/app/oracle/product/11.2.0/db_1:N改为testdb:/u01/app/oracle/product/11.2.0/db_1:Y###注意替换对应 ORACLE_SID 和 ORACLE_HOME2、修改$ORACLE_HOME/bin/dbstart(oracle用户操作)echo $ORACLE_HOMEvi $ORACLE_…

浅析微软的网关项目 -- ReverseProxy

浅析微软的网关项目--ReverseProxyIntro最近微软新开了一个项目 ReverseProxy &#xff0c;也叫做 YARP(A Reverse Proxy)官方介绍如下&#xff1a;YARP is a reverse proxy toolkit for building fast proxy servers in .NET using the infrastructure from ASP.NET and .NET.…

[设计模式]模板方法模式

模板方法模式: 定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中。模仿方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 代码如下: #include <iostream> using namespace std;class DrinkTemplate { public:virtual void Boi…

Max Sum Plus Plus HDU - 1024(动态规划求最大M子段和)

题意&#xff1a; ----最大M子段和问题 给定由 n个整数&#xff08;可能为负整数&#xff09;组成的序列以及一个正整数 m&#xff0c;要求确定序列的 m个不相交子段&#xff0c;使这m个子段的总和达到最大&#xff0c;求出最大和。 题目&#xff1a; Now I think you have …

oracle游标的常用属性,Oracle基础知识(二十六) - Oracle游标常用属性

Oracle游标相信大家都不陌生&#xff0c;下面就为您详细介绍Oracle游标的常用属性&#xff0c;如果您对Oracle游标方面感兴趣的话&#xff0c;不妨一看。Oracle游标常用属性&#xff1a;%FOUND&#xff1a;变量最后从游标中获取记录的时候&#xff0c;在结果集中找到了记录。%N…

差距(分享)

非985大学生, 你和别人的差距在哪里?&#xff08;转&#xff09; 非985大学生, 你和别人的差距在哪里? 中国青年报03-24 在知乎上看到这样一段话&#xff1a; “渣学校意味着渣教学&#xff0c;渣教学意味着渣学历&#xff0c;渣学历意味着渣就业&#xff0c;就算以后考了研究…