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 ...
随机推荐
- SpringBoot2.0 整合 Shiro 框架,实现用户权限管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Shiro简介 1.基础概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.作为一款安全 ...
- PAT 1007 Maximum Subsequence Sum 最大连续子序列和
Given a sequence of K integers { N1, N2, …, NK }. A continuous subsequence is defined to be { Ni, Ni ...
- ADO.NET ORM数据库增删改查封装(工具一)
约束 public abstract class BaseModel { public int Id { get; set; } } 连接字符串 public static readonly stri ...
- 常用类-excel转csv
public class ExcelFileHelper { public static bool SaveAsCsv(string excelFilePath, string destination ...
- (转)深入解析TensorFlow中滑动平均模型与代码实现
本文链接:https://blog.csdn.net/m0_38106113/article/details/81542863 指数加权平均算法的原理 TensorFlow中的滑动平均模型使用的是滑动 ...
- 对python中等值和大小比较
等值.大小比较 在python中,只要两个对象的类型相同,且它们是内置类型(字典除外),那么这两个对象就能进行比较.关键词:内置类型.同类型.所以,两个对象如果类型不同,就没法比较,比如数值类型的数值 ...
- Java后端高频面试题汇总
Java后端面试题汇总 近来,分专题更新了Java后端面试题,此文章对这些文章做一个目录式的整理,方便查看 1.Java基础 https://www.cnblogs.com/autism-dong ...
- 【单条记录锁】select single for update
示例: DATA: wa_t001 type t001. select single for update * into wa_t001 from t001 where bukrs = '1000'. ...
- QT总结
作为一个QT(C++/linux/windows)开发工程师,把自己在工作中遇到的一些QT问题持续总结给大家,一起分享: 一.隐藏鼠标:QApplication::setOverrideCursor( ...
- ABP入门教程15 - 小结
点这里进入ABP入门教程目录 效果预览 至此,ABP入门教程的CURD(增删改查)示例已完成,效果如下 登录 首页 查询课程 新增课程 修改课程 删除课程 阶段总结 关键步骤: 领域层创建实体基础设施 ...