最近遇到一个php爬虫的问题,在传统中,执行爬虫认为,php的file_get_contens每次只能爬取一个网页。因此爬虫运行中出现这样问题,前一秒执行爬取操作,网络下行满载,cpu负荷越0,下一秒钟cpu负荷满载,网络下行为0,这样就没有充分利用好网络和本地硬件资源,如果两者可以同时执行,那么原来2秒的操作优化后只要1秒来执行,效率提高100%。理论上cpui和网络同时满载是可行,下面思考下方案了。

1、爬取任务分摊

如果将100个网页爬取任务分为5份,然后分为t1.php、t2.php、t3.php、t4.php、t5.php这5个文件来处理,每个处理20个爬取任务,虽然整个过程不能提高400%的效率,但基本能最大限度利用网络资源和本地硬件资源。这种方式可以的,只是不够方便,需要人工开5个tab来执行。下面是依照上思路来的

2、php5的内置函数、模拟同时执行的多个请求

这里需要php5的两个函数stream_socket_client和stream_select,具体的可以查询手册,这里只说在此处的用法。

http://www.ibm.com/developerworks/cn/opensource/os-php-multitask/ ,这篇文章在介绍实现中比较详细,但是很可惜,这篇文章应该是大家从国外翻译过来的传抄者甚多,目前网上很多的相关代码基本上都不可用,这里的代码也有问题。经过研究和修改,这个给出可正常运行的代码。

date_default_timezone_set('PRC');

echo "Program starts at ". date('h:i:s') . ".\n
";

$timeout=10;

$result=array();

$sockets=array();

$convenient_read_block=8192;

$delay=15;

$id=0;

while($delay>0)

{

$s=stream_socket_client("phaseit.net:80", $errno,$errstr,$timeout);

if($s)

{

$http_message="GET /demonstration/delay?delay=".$delay." HTTP/1.0\r\nHost: phaseit.net\r\nAccept: */*\r\n\r\n";

fwrite($s,$http_message);

$sockets[$id++]=$s;

}

else

{

echo "Stream " . $id . " failed to open correctly.";

}

$delay-= 3;

//echo $delay;

}

$w=NULL;

$e=NULL;

while (count($sockets))

{

$read=$sockets;

stream_select($read,$w,$e,$timeout);

if (count($read))

{

foreach ($read as $r)

{

$id=array_search($r, $sockets);

$data=fread($r,$convenient_read_block);

if (strlen($data) == 0)

{

echo "Stream " . $id . " closes at " . date('h:i:s') . ".\n
";

//echo $result[$id]."
";

fclose($r);

unset($sockets[$id]);

}

else

{

$result[$id].= $data;

}

}

}

else

{

echo "Time-out!\n";

break;

}

}

?>

可正常执行。

ps:过程中出现的问题:Strict Standards: Only variables should be passed by reference(原因:源代码中stream_select($read, $w=null, $e=null, $timeout);  这种写法标准,某些环境会出错。相关wiki:http://efreedom.com/Question/1-9601698/PHP-Ignores-Passing-Reference-Var-Assigned-Function-Call 。

stream_socket_client的作用是打开5个远程端口(这里是打开t1.php、t2.php等5个本地端口),替代fsockopen,兼容性较好。

stream_select来分配执行,特别之处是能模拟5个请求并发,fgets是不断读取这个5个网页返回的结果,直到返回=0,表示远程的脚本执行结束(5个php请求都如此操作),然后谁先返回结果,谁就显示出Stream X closes at XXXX 来。

fwrite可以对流操作,具体逻辑也一样,既在流后面加上一段字符。

fgets读取流中字符。当然fgets涉及指针操作。

总结:这个脚本可能不是特别能显示出效果,但是该方法在多个爬虫任务运行时候,就能显示出特点了,并行爬取100个页面,能极大提高效率,摆脱php单线程的短板。

php 多任务,PHP并行多任务研究(笔记)相关推荐

  1. 并行多任务学习论文阅读(二)同步和异步优化算法

    1.并行与分布式多任务学习(Multi-task Learning, MTL)简介 我们在上一篇文章<并行多任务学习论文阅读(一)多任务学习速览>(链接:https://www.cnblo ...

  2. 中国移动飞信的研究 笔记一

    中国移动飞信的研究 笔记一 早就 听说 飞信是微软为移动做的.而且 程序还没有 加混淆 所以 可以反编译. 用 Reflector 就可以看见源代码. 网上一搜 发现到目前为止 已经有不少公司或个人对 ...

  3. 中国移动飞信的研究 笔记三

    中国移动飞信的研究 笔记三 最近项目比较忙,自己的事情都没有时间做了. 今天只是研究了一点点 飞信.对于飞信来说,入口所在的命名空间是 : Imps.Client.PC. 既然这样我们就将此 命名空间 ...

  4. python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...

    多任务 CPU承担了所有的计算任务.一个CPU在一个时间切片里只能运行一个程序.当我们想同时运行多于一个程序的时候,就是多任务,例如同时运行微信,QQ,浏览器等等.多任务的目的是提升程序的执行效率,更 ...

  5. Jenkins-Multijob plugin多任务串并行

    Jenkins-Multijob plugin多任务串并行 由于项目采用分布式服务架构,后端拆分为对外提供接口的接口层和对内提供服务的服务层,而服务层项目A又引用项目B和C服务,这时发布时就要求先发布 ...

  6. python多任务_python之多任务

    什么是多任务? 通俗点说就是同一时间干多件事. 多线程实例:我们在看电影的时候一般会吃爆米花,这是同时进行的, 首先没有多线程的情况 import time def movietheaters(): ...

  7. “抢先式多任务”“协同式多任务”

    在"多任务"一文中,我们提到了"协同式多任务"与"抢先式多任务"的概念和二者的区别,谈到现在主流的多任务实现是"抢先式多任务&qu ...

  8. Day1--FreeRTOS简介及多任务点灯、多任务传参、Mutex

    实时操作系统(Real Time Operating System,简称RTOS) Arduino任务执行流程:单线程执行任务 RTOS:可以同时执行所有Task,每个任务都有自己的循环 操作系统排行 ...

  9. spring 定时任务 多任务并行执行,多任务多线程 单任务单线程执行实现细节

    前提:spring 定时任务,默认是多任务单线程执行,也就是串行执行的 当前需求: 1. 多任务多线程执行(不同的定时任务并行执行) 2.同一个定时任务单线程执行(保证一个定时任务A在执行完成前,A的 ...

  10. 斯坦福教授告诉你:什么是多任务学习「 CS330 笔记 (二) 」

    文章目录 写在前面 多任务学习基础 符号说明(notation) 任务的定义 常见任务举例 多任务分类问题(Multi-task classification) 多标签学习问题(Multi-label ...

最新文章

  1. 谈 JavaScript 浮点数计算精度问题(如0.1+0.2!==0.3)
  2. echarts legend文字配置多个颜色(转)
  3. Java 流(Stream)、文件(File)和IO -- Java ByteArrayOutputStream类
  4. 【图像分割模型】快速道路场景分割—ENet
  5. shell获取git最近一次提交信息_Git修改commit提交信息
  6. Cobbler无人值守安装系统史上最细实践文档
  7. 电脑显示器闪屏_时尚超薄可升降:华硕新品家用护眼显示器MZ27AQL
  8. springboot+JPARepository实现增删改查
  9. CentOS 6.8内核版本升级(升级至3.10)(转)
  10. 【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
  11. ASP.NET MVC 5 - 入门
  12. JSP中的公共菜单模板选中状态的添加
  13. 7-2 矮冬瓜火锅店周年庆“冬瓜会员”查询
  14. 不良资产证券化是什么意思
  15. RPG游戏制作-01-搭建游戏框架,初进游戏世界
  16. android中view手势滑动冲突的两种解决方法
  17. php程序员述职材料_求一个PHP程序员的试用期转正的述职报告 要求详细一点的 分数不够可以再加,在线急等...
  18. 除了X站,程序员还喜欢上这些网站...
  19. 夕阳无限好 只是近黄昏
  20. 卷积神经网络与神经网络,卷积神经网络基础知识

热门文章

  1. 组织结构及权限模型设计
  2. redis源码编译和调试
  3. Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
  4. Jenkins实现生产环境部署文件的回滚操作(Windows)
  5. oracle spfile和pfile文件(转)
  6. 【BZOJ】3495: PA2010 Riddle
  7. SkewTransform
  8. GARFIELD@09-20-2004
  9. oracle数据库状态是started,ORACLE数据库状态与v$instance视图
  10. 车牌识别 php,eoLinker-API_Shop_OCR-车牌识别_API接口_PHP调用示例代码