PHP多线程之内部多线程实例分析


Posted in PHP onMarch 09, 2015

本文实例分析了PHP多线程之内部多线程用法。分享给大家供大家参考。具体如下:

<?php

class Http_MultiRequest

{

    //要并行抓取的url 列表

    private $urls = array();

    //curl 的选项

    private $options;

    //构造函数

    function __construct($options = array())

    {

        $this->setOptions($options);

    }

    //设置url 列表

    function setUrls($urls)

    {

        $this->urls = $urls;

        return $this;

    }

    //设置选项

    function setOptions($options)

    {

        $options[CURLOPT_RETURNTRANSFER] = 1;

        if (isset($options['HTTP_POST'])) 

        {

            curl_setopt($ch, CURLOPT_POST, 1);

            curl_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']);

            unset($options['HTTP_POST']);

        }

        if (!isset($options[CURLOPT_USERAGENT])) 

        {

            $options[CURLOPT_USERAGENT] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)';

        }

        if (!isset($options[CURLOPT_FOLLOWLOCATION])) 

        {

            $options[CURLOPT_FOLLOWLOCATION] = 1;

        }

        if (!isset($options[CURLOPT_HEADER]))

        {

            $options[CURLOPT_HEADER] = 0;

        }

        $this->options = $options;

    }

    //并行抓取所有的内容

    function exec()

    {

        if(empty($this->urls) || !is_array($this->urls))

        {

            return false;

        }

        $curl = $data = array();

        $mh = curl_multi_init();

        foreach($this->urls as $k => $v)

        {

            $curl[$k] = $this->addHandle($mh, $v);

        }

        $this->execMulitHandle($mh);

        foreach($this->urls as $k => $v)

        {

            $data[$k] = curl_multi_getcontent($curl[$k]);

            curl_multi_remove_handle($mh, $curl[$k]);

        }

        curl_multi_close($mh);

        return $data;

    }

    //只抓取一个网页的内容。

    function execOne($url)

    {

        if (empty($url)) {

            return false;

        }

        $ch = curl_init($url);

        $this->setOneOption($ch);

        $content = curl_exec($ch);

        curl_close($ch);

        return $content;

    }

    //内部函数,设置某个handle 的选项

    private function setOneOption($ch)

    {

        curl_setopt_array($ch, $this->options);

    }

    //添加一个新的并行抓取 handle

    private function addHandle($mh, $url)

    {

        $ch = curl_init($url);

        $this->setOneOption($ch);

        curl_multi_add_handle($mh, $ch);

        return $ch;

    }

    //并行执行(这样的写法是一个常见的错误,我这里还是采用这样的写法,这个写法

    //下载一个小文件都可能导致cup占用100%, 并且,这个循环会运行10万次以上

    //这是一个典型的不懂原理产生的错误。这个错误在PHP官方的文档上都相当的常见。)

    private function execMulitHandle($mh)

    {

        $running = null;

        do {

            curl_multi_exec($mh, $running);

        } while ($running > 0);

    }

}

/*下面是上面的类的一个测试的例子:*/

$urls = array("http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http://www.google.com", "http://www.sina.com.cn", );

$m = new Http_MultiRequest();

$t = microtime(true);

$m->setUrls($urls);

//parallel fetch(并行抓取):

$data = $m->exec();

$parallel_time = microtime(true) - $t;

echo $parallel_time . "\n";

$t = microtime(true);

//serial fetch(串行抓取):

foreach ($urls as $url)

{

    $data[] = $m->execOne($url);

}

$serial_time = microtime(true) - $t;

echo $serial_time . "\n";

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
php解析json数据实例
Aug 19 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
Mar 17 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
php简单的上传类分享
May 15 PHP
php处理json格式数据经典案例总结
May 19 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 PHP
asp.net和php的区别点总结
Oct 10 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 #PHP
php建立Ftp连接的方法
Mar 07 #PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 #PHP
PHP实现懒加载的方法
Mar 07 #PHP
php根据某字段对多维数组进行排序的方法
Mar 07 #PHP
PHP多线程编程之管道通信实例分析
Mar 07 #PHP
PHP查询快递信息的方法
Mar 07 #PHP
You might like
php分页查询的简单实现代码
2017/03/14 PHP
php实现简单四则运算器
2020/11/29 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
如何快速上手Vuex
2017/02/14 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
Python md5与sha1加密算法用法分析
2017/07/14 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
大学生就业自荐信
2013/10/26 职场文书
房地产融资计划书
2014/01/10 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
会议接待欢迎标语
2014/10/08 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
商铺门面租房协议书
2014/10/21 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
期中考试后的感想
2015/08/07 职场文书