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作为Shell脚本语言使用
Oct 09 PHP
一贴学会PHP 新手入门教程
Aug 03 PHP
PHP 动态随机生成验证码类代码
Apr 09 PHP
PHP开发需要注意的安全问题
Sep 01 PHP
url decode problem 解决方法
Dec 26 PHP
浅析十款PHP开发框架的对比
Jul 05 PHP
ThinkPHP路由详解
Jul 27 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
php表单处理操作
Nov 16 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
初识Node.js
2015/03/20 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
Python从MP3文件获取id3的方法
2015/06/15 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
荣耀商城:HIHONOR
2020/11/03 全球购物
国税会议欢迎词
2014/01/16 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
初一家长会邀请函
2014/01/31 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
大学生毕业个人总结
2015/02/15 职场文书
大国崛起观后感
2015/06/02 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
Python快速实现一键抠图功能的全过程
2021/06/29 Python
Promise静态四兄弟实现示例详解
2022/07/07 Javascript