欢迎来到天天文库
浏览记录
ID:8922367
大小:15.32 KB
页数:4页
时间:2018-04-12
《php单线程实现并行抓取网页》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、本PHP教程将模拟并行抓取多个页面信息的过程,关键在于单线程的并行处理。一般情况下,大家写抓取多个页面信息的程序都采用串行方案,但获取周期过长,不实用。于是我想到用curl去并行抓取。但是,最后发现,那个虚拟服务器上没有curl,这真是让人纠结。于是,我决定改变思路,用单个线程也实现多个线程的效果。我想对网络编程有点了解的人肯定知道IO复用这个概念,当然PHP上也是支持的,而且,内部支持,不需要任何扩展。可能有很多年编程经验的人对PHP的stream函数可能不太了解。PHP的压缩文件流,文件流,tcp协议下的应用都封装成一个st
2、ream。所以,读本地文件和读网络文件没有任何的差别。说了这样多,我想大家都基本上明白了,直接贴上代码吧:代码比较的粗糙,如果大家要实际用的话,还是要处理一些细节问题。代码
3、query'];$fp=stream_socket_client("tcp://{$host}:80",$errno,$errstr,30);if(!$fp){echo"$errstr($errno)";returnfalse;}else{fwrite($fp,"GET{$get}HTTP/1.0rHost:{$host}rAccept:*/*rr");}return$fp;}functionhttp_multi_get($urls){$result=array();$fps=array()
4、;foreach($urlsas$key=>$url){$fp=http_get_open($url);if($fp===false){$result[$key]=false;}else{$result[$key]='';$fps[$key]=$fp;}}while(1){$reads=$fps;if(empty($reads)){break;}if(($num=stream_select($reads,$w=null,$e=null,30))===false){echo"error";returnfalse;}elseif($
5、num>0){//canreadforeach($readsas$value){$key=array_search($value,$fps);if(!feof($value)){$result[$key].=fread($value,128);}else{unset($fps[$key]);}}}else{//timeoutecho"timeout";returnfalse;}}foreach($resultas$key=>&$value){if($value){$value=explode("rr",$value,
6、2);}}return$result;}$urls=array();$urls[]="http://www.qq.com";$urls[]="http://www.sina.com.cn";$urls[]="http://www.sohu.com";$urls[]="http://www.blue1000.com";//并行的抓取$t1=microtime(true);$result=http_multi_get($urls);$t1=microtime(true)-$t1;var_dump("cost:".$t1);//串行的
7、抓取$t1=microtime(true);foreach($urlsas$value){file_get_contents($value);}$t1=microtime(true)-$t1;var_dump("cost:".$t1);?>最后运行的结果:string'cost:3.2403128147125'(length=21)string'cost:6.2333900928497'(length=21)基本上是两倍的效率,当然,发现新浪非常的慢,要2.5s左右,基本上是被他给拖累了,360只要0.2s如果,所有网站都差不多
8、的速度,并行的数目更大,那么差的倍数也就越大。关键词:网页线程并行抓取0顶一下收藏推荐打印
9、录入:blue1000
10、阅读:1484次php中如何判断中英文字符博客中添加日历的php代码最新图文ThinkPHP3.1编程开发快速入门教程之:数据篇ThinkPHP3
此文档下载收益归作者所有