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中常用编辑器推荐
Jan 02 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
PHP 图像尺寸调整代码
May 26 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
Jun 30 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
php7 图形用户界面GUI 开发示例
Feb 22 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 表单验证实现代码
2009/03/10 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
PHP 裁剪图片
2021/03/09 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
js 幻灯片的实现
2011/12/06 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
chrome调试javascript详解
2015/10/21 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
Python实现提取文章摘要的方法
2015/04/21 Python
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python如何生成网页验证码
2018/07/28 Python
WxPython实现无边框界面
2019/11/18 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
教师自我鉴定
2013/12/13 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
项目申请汇报材料
2014/08/16 职场文书
药品开票员岗位职责
2015/04/15 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers