php 多任务,PHP并行多任务研究(笔记)
最近遇到一个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.并行与分布式多任务学习(Multi-task Learning, MTL)简介 我们在上一篇文章<并行多任务学习论文阅读(一)多任务学习速览>(链接:https://www.cnblo ...
- 中国移动飞信的研究 笔记一
中国移动飞信的研究 笔记一 早就 听说 飞信是微软为移动做的.而且 程序还没有 加混淆 所以 可以反编译. 用 Reflector 就可以看见源代码. 网上一搜 发现到目前为止 已经有不少公司或个人对 ...
- 中国移动飞信的研究 笔记三
中国移动飞信的研究 笔记三 最近项目比较忙,自己的事情都没有时间做了. 今天只是研究了一点点 飞信.对于飞信来说,入口所在的命名空间是 : Imps.Client.PC. 既然这样我们就将此 命名空间 ...
- python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...
多任务 CPU承担了所有的计算任务.一个CPU在一个时间切片里只能运行一个程序.当我们想同时运行多于一个程序的时候,就是多任务,例如同时运行微信,QQ,浏览器等等.多任务的目的是提升程序的执行效率,更 ...
- Jenkins-Multijob plugin多任务串并行
Jenkins-Multijob plugin多任务串并行 由于项目采用分布式服务架构,后端拆分为对外提供接口的接口层和对内提供服务的服务层,而服务层项目A又引用项目B和C服务,这时发布时就要求先发布 ...
- python多任务_python之多任务
什么是多任务? 通俗点说就是同一时间干多件事. 多线程实例:我们在看电影的时候一般会吃爆米花,这是同时进行的, 首先没有多线程的情况 import time def movietheaters(): ...
- “抢先式多任务”“协同式多任务”
在"多任务"一文中,我们提到了"协同式多任务"与"抢先式多任务"的概念和二者的区别,谈到现在主流的多任务实现是"抢先式多任务&qu ...
- Day1--FreeRTOS简介及多任务点灯、多任务传参、Mutex
实时操作系统(Real Time Operating System,简称RTOS) Arduino任务执行流程:单线程执行任务 RTOS:可以同时执行所有Task,每个任务都有自己的循环 操作系统排行 ...
- spring 定时任务 多任务并行执行,多任务多线程 单任务单线程执行实现细节
前提:spring 定时任务,默认是多任务单线程执行,也就是串行执行的 当前需求: 1. 多任务多线程执行(不同的定时任务并行执行) 2.同一个定时任务单线程执行(保证一个定时任务A在执行完成前,A的 ...
- 斯坦福教授告诉你:什么是多任务学习「 CS330 笔记 (二) 」
文章目录 写在前面 多任务学习基础 符号说明(notation) 任务的定义 常见任务举例 多任务分类问题(Multi-task classification) 多标签学习问题(Multi-label ...
最新文章
- 谈 JavaScript 浮点数计算精度问题(如0.1+0.2!==0.3)
- echarts legend文字配置多个颜色(转)
- Java 流(Stream)、文件(File)和IO -- Java ByteArrayOutputStream类
- 【图像分割模型】快速道路场景分割—ENet
- shell获取git最近一次提交信息_Git修改commit提交信息
- Cobbler无人值守安装系统史上最细实践文档
- 电脑显示器闪屏_时尚超薄可升降:华硕新品家用护眼显示器MZ27AQL
- springboot+JPARepository实现增删改查
- CentOS 6.8内核版本升级(升级至3.10)(转)
- 【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
- ASP.NET MVC 5 - 入门
- JSP中的公共菜单模板选中状态的添加
- 7-2 矮冬瓜火锅店周年庆“冬瓜会员”查询
- 不良资产证券化是什么意思
- RPG游戏制作-01-搭建游戏框架,初进游戏世界
- android中view手势滑动冲突的两种解决方法
- php程序员述职材料_求一个PHP程序员的试用期转正的述职报告 要求详细一点的 分数不够可以再加,在线急等...
- 除了X站,程序员还喜欢上这些网站...
- 夕阳无限好 只是近黄昏
- 卷积神经网络与神经网络,卷积神经网络基础知识
热门文章
- 组织结构及权限模型设计
- redis源码编译和调试
- Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
- Jenkins实现生产环境部署文件的回滚操作(Windows)
- oracle spfile和pfile文件(转)
- 【BZOJ】3495: PA2010 Riddle
- SkewTransform
- GARFIELD@09-20-2004
- oracle数据库状态是started,ORACLE数据库状态与v$instance视图
- 车牌识别 php,eoLinker-API_Shop_OCR-车牌识别_API接口_PHP调用示例代码