curl_multi_*模拟多线程异步用法
测试环境:
- PHP版本:php7.0.10
- mysql版本:5.7.14
测试用例:循环插入两千行数据到数据库
    public function test_syn($pc){
       // $pc = trim(I('pc'));
       $model = M('','');
       $model -> startTrans();
       try{
           $sql = 'update d_fhditem set num = num +1 where id= 1365';
           $res = $model -> execute($sql);
       }catch(\Exception $e){
           $res = false;
       }
       if($res === false){
           $model -> rollback();
           echo '更新失败<br>';
           die;
       }
       try{
           $sql = 'insert into check_thread_log(`pc`) values('.$pc.')';
           $res = $model -> execute($sql);
       }catch(\Exception $e){
           $res = false;
       }
       if($res === false){
           $model -> rollback();
            echo '添加事务失败<br>';
            die;
       }
       $res = $model -> commit();
       if($res === false){
           $model -> rollback();
           echo '提交事务失败';
       }
       //echo '测试成功'.$pc.'<br>';
    }
测试一:一次生成2000个curl句柄,同时运行
    public function checkThread3(){
        $t = microtime(true);
        $row = 2000;
        $i = 0;
        $arr_handle = array();
        while($i < $row){
            $res = $res.$i;
            $res = curl_init();
            $url = 'http://localhost/InTimeCommnuicate/index.php/Home/WebstockApi/test_syn/pc/'.$i;
            curl_setopt($res, CURLOPT_URL , $url);
            curl_setopt($res, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($res, CURLOPT_HEADER, 0);
            $arr_handle[] = $res;
            $i++;
        }
        $cmi = curl_multi_init();
        //添加2000条句柄
        foreach($arr_handle as $k => $v){
            curl_multi_add_handle($cmi, $v);
        }
        $still_running = null;
        do{
            usleep(10000);
            $res = curl_multi_exec($cmi, $still_running);
            $j++;
        }while($still_running > 0);
        foreach($arr_handle as $v){
            curl_multi_remove_handle($cmi, $v);
        }
        curl_multi_close($cmi);
        $t1 = microtime(true);
        echo '<hr>并发执行时间:'.($t1 - $t).'<br>';
    }
  运行结果:
mysql查询:
小结:从结果可以看出,当同时运行的数量过大时会有部分丢失。
测试二:对程序进行部分改进,把并发数量控制在400条以内
    public function checkThread(){
        $t = microtime(true);
        $row = 2000;
        $i = 0;
        $arr_handle = array();
        while($i < $row){
            $res = $res.$i;
            $res = curl_init();
            $url = 'http://localhost/InTimeCommnuicate/index.php/Home/WebstockApi/test_syn/pc/'.$i;
            curl_setopt($res, CURLOPT_URL , $url);
            curl_setopt($res, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($res, CURLOPT_HEADER, 0);
            $arr_handle[] = $res;
            $i++;
        }
       $cmi = curl_multi_init();
       //最大并发数
       $maxRunHandle = 400;
       //当前添加句柄
       $thisAddHandle = 0;
       //需要运行条数
       $maxRow = count($arr_handle);
       //添加400条句柄
       foreach($arr_handle as $k => $v){
           if($k >= $maxRunHandle) break;
           curl_multi_add_handle($cmi, $v);
           $thisAddHandle++;
       }
       $still_running = null;
       $j = 1;
       do{
           //当运行并发数小于400且并发
           if($still_running < 400 && $thisAddHandle < $maxRow){
               curl_multi_add_handle($cmi, $arr_handle[$thisAddHandle]);
               $thisAddHandle++;
           }
           usleep(10000);
           $res = curl_multi_exec($cmi, $still_running);
          // echo '第'.$j.'次输并发执行的句柄数量为'.$still_running.'<br>';
           $j++;
       }while($still_running > 0);
       foreach($arr_handle as $v){
           curl_multi_remove_handle($cmi, $v);
       }
        curl_multi_close($cmi);
       $t1 = microtime(true);
       echo '<hr>并发执行时间:'.($t1 - $t).'<br>';
    }
  运行结果:
mysql查询:
小结:可以看出运行速度比原来的快,而且没有任何的数据丢失。
测试三:不使用curl函数,直接插入2000行数据
    public function checkThread2(){
        $t = microtime(true);
        $row = 2000;
        $i = 0;
        while($row > $i){
            $this -> test_syn($i);
            $i++;
        }
        $t1 = microtime(true);
        echo '<hr>while循环时间'.($t1 - $t).'<br>';
    }
  结果:
mysql查询:
curl_multi_*模拟多线程异步用法的更多相关文章
- 通过curl模拟多线程抓取网页(curl_multi_*)
		curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ... 
- Android 多线程 异步加载
		Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ... 
- 可扩展多线程异步Socket服务器框架EMTASS 2.0   (转自:http://blog.csdn.net/hulihui)
		可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ... 
- 【JavaScript】吃饱了撑的系列之JavaScript模拟多线程并发
		前言 最近,明学是一个火热的话题,而我,却也想当那么一回明学家,那就是,把JavaScript和多线程并发这两个八竿子打不找的东西,给硬凑了起来,还写了一个并发库concurrent-thread-j ... 
- Java使用多线程异步执行批量更新操作
		import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; impor ... 
- php模拟多线程
		一:应该知道的: php本身是不支持多线, 但是php的好搭档,apache和linux是支持的,故lamp才是最佳组合,还在使用win服务器的现在知道为什么要用linux吧.既然是模拟的, 就不是真 ... 
- C# 实现的多线程异步Socket数据包接收器框架
		转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ... 
- C# 多线程 异步加载 窗体
		C# 多线程 异步加载 窗体 分类: C#2014-05-28 16:57 1286人阅读 评论(0) 收藏 举报 异步加载 我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗 ... 
- shell 中用管道模拟多线程
		shell 中用管道模拟多线程 这里以两个例子来对比多线程和单进程 单线程的例子 # config.txt在这个例子和多线程的例子中都会用到 [root@ns_10.2.1.242 test]$ ca ... 
随机推荐
- IT兄弟连 HTML5教程 CSS3揭秘 在HTML文档中放置CSS的几种方式
			有很多方法将样式表加入到HTML中,每种方法都有自己的优点和缺点.新的HTML元素和属性已被加入,以允许样式表与HTML文档更简易地组合起来.将样式表加入到HTML中的常用方法有内联样式表.嵌入一张样 ... 
- Java中String直接赋字符串和new String的一些问题
			今天课堂测试做了几道String的练习题,做完直接心态爆炸...... 整理自下面两篇博客: https://www.cnblogs.com/marsitman/p/11248001.html htt ... 
- maven打成jar包后,其他工程导入不进去
			关键点 classifier中配置exec pom文件配置 <plugin> <groupId>org.springframework.boot</groupId> ... 
- 执行超大的.sql文件处理,100M++
			sqlcmd的命令参数如下: 1 [-U 登录 ID] [-P 密码] 2 [-S 服务器] [-H 主机名] [-E ... 
- scrapy在pycharm配置启动(无需命令行启动)
			一.新建文件 run.py这个名字随意哈 方法一. from scrapy.cmdline import execute execute(['scrapy','crawl','爬虫程序名字','-a' ... 
- ElementUI项目中怎样引用Jquery
			场景 使用ElementUI的快速开始的项目模板搭建Element项目后, 要在vue页面中使用jquery的语法. 这里直接使用$.ajax会提示$找不到. 注: 博客:https://blog.c ... 
- Python中使用cutecharts实现简单的手绘风格的图表
			场景 效果 cutecharts的Github: https://github.com/chenjiandongx/cutecharts 注: 博客: https://blog.csdn.net/ba ... 
- Violet音乐社区界面原型手册
			目录 Violet音乐社区界面原型手册 一.引言 1.0 项目前阶段相关文档 1.1 编写目的 1.2 开发背景 二.界面原型展示 2.0 界面设计说明 2.1 首页 2.2 歌单/专辑/单曲界面 2 ... 
- 微信小程序通过getPhoneNumber后台PHP解密获取用户手机号码
			之前做的版本用户这块是以获取用户openid为凭证,最近改版重新整理了一下,新增注册登录以手机号码为主, 两种(正常注册手机号码-密码+一键获取当前用户手机号码) getPhoneNumber这个组件 ... 
- HashMap与HashTable的区别和理解
			Hashmap的理解 1:HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.HashMap储存的是键值对,HashMap很快.此类不保 ... 
