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 相关文章推荐
PHP中$_SERVER的详细参数与说明
Jul 29 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
Jun 01 PHP
使用php显示搜索引擎来的关键词
Feb 13 PHP
PHP实现过滤掉非汉字字符只保留中文字符
Jun 04 PHP
php将html转成wml的WAP标记语言实例
Jul 08 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
php基于curl实现的股票信息查询类实例
Nov 11 PHP
详解PHP处理密码的几种方式
Nov 30 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
关于PHP中interface的用处详解
Jul 26 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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP操作xml代码
2010/06/17 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
Python Tkinter GUI编程入门介绍
2015/03/10 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
python多进程使用函数封装实例
2020/05/02 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
结婚典礼证婚词
2014/01/11 职场文书
工程部部长岗位职责
2015/02/12 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书