PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比
公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题。根据玩家反映BUG排查,是因为某个模块下日志表出现了数据格式问题导致。
目前想到的是有两种方案解决,第一种就是把所有的日志表数据修复;第二种就是把程序逻辑修改一下,保证查找格式正确。
我的做法是想把所有数据修复一下,就从线上数据库拿了7000条数据在本地修改测试,保证无误再执行下一步计划。
由于想到数据量会很大,我这里也顺便实验了一下多进程效率和单进程效率的对比。下面看下代码,有很多需要优化的地方....这里只是简单的案例.... 两个数据表在最下面会分享链接测试.....
多进程实例
<?php
//index.php
$start_memory = memory_get_usage(); //开始内存
echo '开始内存:' . $start_memory . "\r\n"; $start_time = microtime(true); //获取程序开始执行的时间 $mysqli = new mysqli();//实例化mysqli
$mysqli->connect('localhost','root','wt000000','up'); $all_uid_sql = 'select uid from zc_kapai_fashion_show_intensify_log group by uid'; $all_user_result = $mysqli->query($all_uid_sql);
while (!!$_row = $all_user_result->fetch_assoc()) {
$all_user[] = $_row['uid'];
} //引入文件
require 'up_sql.php'; //count($all_user) = 84
$x_count = ceil(count($all_user)/); //fork 9个进程 进程太多,可能会导致服务器系统资源耗尽而崩溃,所以必须控制进程数量
for($i = ; $i < $x_count; ++$i) {
$pids[$i] = pcntl_fork();
if($pids[$i] == -) {
die('fork error');
} else if ($pids[$i]) { //父进程逻辑
pcntl_wait($status, WNOHANG);
} else { //子进程逻辑
$start = $i * ;
$tmp_users = array_splice($all_user, $start, );
if (is_array($tmp_users) && !empty($tmp_users)) {
up_sql($tmp_users) ;
}
exit;
}
} $all_user_result->free();
$mysqli->close(); //别忘了关闭你的"小资源"; $end_time = microtime(true); //获取程序执行结束的时间
$run_time = ($end_time - $start_time) * ; //计算差值 毫秒
echo "[页面执行时间:{$run_time}]毫秒" . "\r\n";
$end_memory = memory_get_usage();
echo '运行后内存:'. $end_memory . "\r\n"; echo '使用的内存:' . ($end_memory - $start_memory) . "\r\n";
echo '回到正常内存:'.memory_get_usage();
<?php
//up_sql.php
//修改语句的方法
function up_sql ($temp_users = []) { $mysqli = new mysqli();//实例化mysqli
$mysqli->connect('localhost','root','wt000000','up'); foreach ($temp_users as $u) {
$sql1 = 'select id,fid from zc_kapai_fashion_show_intensify_log where uid =' .$u;//创建一句SQL语句
$sql2 = 'select id from zc_kapai_own_fashion_show where uid =' . $u;//创建一句SQL语句 $result1=$mysqli->query($sql1);
$result2=$mysqli->query($sql2); $log = [];
$show = [];
while (!!$_row = $result1->fetch_assoc()) {
$log[] = $_row;
}
while (!!$_row = $result2->fetch_assoc()) {
$show[] = $_row;
}
$test = $show[]['id'];
$return_arr = [];
foreach ($log as $lv) {
foreach ($show as $sv) {
$num = intval(substr((string)$sv['id'], , )); //show id ,拿来对比log的fid
if ($num == $lv['fid'] ) {
$arr = [];
$log_len = strlen((string)$lv['fid']);
$cha = - $log_len;
if (intval($cha) > ) {
$tou = (string)(substr($test, , $cha));
$val = $tou. (string)$num;
}
$arr['id'] = $lv['id'];
$arr['to_val'] = $val;
$return_arr[] = $arr;
}
}
} foreach ($return_arr as $v) {
$sql = 'update zc_kapai_fashion_show_intensify_log set fid = ' . $v['to_val'] . ' where id =' .$v['id'];
$mysqli->query($sql);
} }
$result1->free();//释放查询内存(销毁)
$result2->free();//释放查询内存(销毁)
$mysqli->close();//别忘了关闭你的"小资源";
}
Linux下Cli模式运行index.php,查看结果
# php index.php
开始内存:
[页面执行时间:160.7940196991]毫秒
运行后内存:
使用的内存:
回到正常内存:
单进程实例
<?php
//index.php $start_memory = memory_get_usage(); //开始内存
echo '开始内存:' . $start_memory . "\r\n";
$start_time = microtime(true); //获取程序开始执行的时间 $mysqli=new mysqli();//实例化mysqli
$mysqli->connect('localhost','root','wt000000','up'); $all_uid_sql = 'select uid from zc_kapai_fashion_show_intensify_log group by uid';
$all_user_result =$mysqli->query($all_uid_sql); while (!!$_row = $all_user_result->fetch_assoc()) {
$all_user[] = $_row['uid'];
}
foreach ($all_user as $u) {
$sql1='select id,fid from zc_kapai_fashion_show_intensify_log where uid =' .$u;
$sql2='select id from zc_kapai_own_fashion_show where uid =' . $u; $result1=$mysqli->query($sql1);//执行sql语句把结果集赋给$result
$result2=$mysqli->query($sql2);//执行sql语句把结果集赋给$result $log = [];
$show = [];
while (!!$_row = $result1->fetch_assoc()) {
$log[] = $_row;
} while (!!$_row = $result2->fetch_assoc()) {
$show[] = $_row;
}
$test = $show[]['id'];
$return_arr = [];
foreach ($log as $lv) {
foreach ($show as $sv) {
$num = intval(substr((string)$sv['id'], , )); //show id ,拿来对比log的fid
if ($num == $lv['fid'] ) {
$arr = [];
$log_len = strlen((string)$lv['fid']);
$cha = - $log_len;
if (intval($cha) > ) {
$tou = (string)(substr($test, , $cha));
$val = $tou. (string)$num;
}
$arr['id'] = $lv['id'];
$arr['to_val'] = $val;
$return_arr[] = $arr;
}
}
} foreach ($return_arr as $v) {
$sql = 'update zc_kapai_fashion_show_intensify_log set fid = ' . $v['to_val'] . ' where id =' .$v['id']; $mysqli->query($sql);
} } $result1->free(); //释放查询内存(销毁)
$result2->free(); //释放查询内存(销毁)
$all_user_result->free();
$mysqli->close(); //别忘了关闭你的"小资源"; $end_time = microtime(true); //获取程序执行结束的时间
$run_time = ($end_time - $start_time) * ; //计算差值 毫秒
echo "[页面执行时间:{$run_time}]毫秒" . "\r\n";
$end_memory = memory_get_usage();
echo '运行后内存:'. $end_memory . "\r\n"; echo '使用的内存:' . ($end_memory - $start_memory) . "\r\n";
echo '回到正常内存:'.memory_get_usage();
Linux下Cli模式运行index.php,查看结果
# php index.php
开始内存:
[页面执行时间:9905.3988456726]毫秒
运行后内存:
使用的内存:
回到正常内存:
测试结果明显对比,内存和执行时间....这里只是简单测试。
两个数据表
链接:https://pan.baidu.com/s/1ursYdiFB5wCbUf2mfBnWUA 密码:zhta
PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比的更多相关文章
- socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...
- 非阻塞模式下,虽然connect出错,但是getsockopt取得的错误却是0的问题
调试项目代码时,发现了一个奇怪问题,记录如下: 非阻塞模式下,connect发起建链,返回-1(这在非阻塞模式下是很正常的现象).然后将该socket的写事件进行监听,在写事件触发后,getsocko ...
- Socket 阻塞模式和非阻塞模式
阻塞I/O模型: 简介:进程会一直阻塞,直到数据拷贝 完成 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好. 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返 ...
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 ...
- 看到关于socket非阻塞模式设置方式记录一下。
关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...
- 深入 CSocket 编程之阻塞和非阻塞模式
有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server ...
- UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值---部分内容可能不确切,待讨论
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 ...
- 非阻塞模式ServerSocketChannel 聊天室服务器端
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import ja ...
随机推荐
- 【Scrum】-NO.40.EBook.1.Scrum.1.001-【敏捷软件开发:原则、模式与实践】- Scrum
1.0.0 Summary Tittle:[Scrum]-NO.40.EBook.1.Scrum.1.001-[敏捷软件开发:原则.模式与实践]- Scrum Style:DesignPattern ...
- 关于RTSP-Over-HTTP
--------------------更新2018.07.10------------------- myRtspClient-1.3.0开始支持RTSP-Over-HTTP ----------- ...
- python-列表解析、字典解析、集合解析
列表解析.字典解析.集合解析 列表解析 生成一个列表 nums = [1, 3, 9] list_gen = [num**2 for num in nums if x <= 5] # [1, 9 ...
- 开源unittest测试报告源码BSTestRunner.py
开源BSTestRunner 生成HTML测试报告源码: 保存代码到BSTestRunner.py 配合Unittest使用,很完美. python2: """ A Te ...
- [转帖]unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(主要讲区别)
觉得这个讲的挺好的,就转过来了:) 太抽象的理论总是让人眼花缭乱,所以我这里以例证为主. 1,测试OnTriggerEnter和OnCollisionEnter的区别 测试:如果两个物体A,B 两者都 ...
- OEMCC 13.2 集群版本安装部署
之前测试部署过OEMCC 13.2单机,具体可参考之前随笔: OEMCC 13.2 安装部署 当时环境:两台主机,系统RHEL 6.5,分别部署OMS和OMR: OMS,也就是OEMCC的服务端 IP ...
- 43.HTML--a标签之mailto邮箱属性用法
HTML 属性标记之 mailto 的用法详解 大家知道,mailto是网页设计制作中的一个非常实用的html标签,许多拥有个人网页的朋友都喜欢在网站的醒目位置处写上自己的电子邮件地址,这样网页浏 ...
- centos python2升级为python3 升级旧版本django
阿里云centos python3 及django的配置 安装python3后 pip 会把下载的包安入python2.7 下面解决该问题 python3.5安装1,安装依赖包#yum install ...
- Linux中常用的50个命令
1. [命令]:cat [功能说明]: concatenate files and print on the standard output #连接文件并打印到标准输出,有标准输出的都可以用重定向定向 ...
- 用 hashcat 破解 WIFI WPA2破解
首先用CDlinux系统进行抓包,CDlinux抓包我就不详细说明 到这里可以查看如何安装CDlinux http://jingyan.baidu.com/article/7f766daf5173a9 ...