公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题。根据玩家反映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与单进程效率测试对比的更多相关文章

  1. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  2. 非阻塞模式下,虽然connect出错,但是getsockopt取得的错误却是0的问题

    调试项目代码时,发现了一个奇怪问题,记录如下: 非阻塞模式下,connect发起建链,返回-1(这在非阻塞模式下是很正常的现象).然后将该socket的写事件进行监听,在写事件触发后,getsocko ...

  3. Socket 阻塞模式和非阻塞模式

    阻塞I/O模型: 简介:进程会一直阻塞,直到数据拷贝 完成 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好. 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返 ...

  4. 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值  ...

  5. 看到关于socket非阻塞模式设置方式记录一下。

    关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...

  6. 深入 CSocket 编程之阻塞和非阻塞模式

    有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server ...

  7. UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...

  8. 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值---部分内容可能不确切,待讨论

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值  ...

  9. 非阻塞模式ServerSocketChannel 聊天室服务器端

    import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import ja ...

随机推荐

  1. [Java in NetBeans] Lesson 02. Variables, Data Types and Assignment.

    这个课程的参考视频在youtube. 主要学到的知识点有: Data Type: int, char, String, double, boolean. When into printf, int ( ...

  2. 一个简单的MapReduce示例(多个MapReduce任务处理)

    一.需求 有一个列表,只有两列:id.pro,记录了id与pro的对应关系,但是在同一个id下,pro有可能是重复的. 现在需要写一个程序,统计一下每个id下有多少个不重复的pro. 为了写一个完整的 ...

  3. MySQL--8MySQL存储过程小结

    CURD: 就是对数据表进行插入更新删除查找的操作. 预编译:第一次会分析语法是否正确,编译成可识别的命令.然后存在内存中,以后再调用就省去了这两步,效率变高. 第一点:在存储过程内可以写控制语句,可 ...

  4. mac book docker

    mbp的某些方面还是挺有吸引力的啊 但工作中大多数用的还是纯linux而不是类unix的mac os,要在家里的mac os x 和linux之间转转弯,有时候想想还是挺别扭的. 为了从公司-> ...

  5. 第一章入门篇CSS样式的分类、盒模型

    1.CSS样式的分类 CSS样式分为一项4种: 1.内联样式表,直接写在元素style属性里面的样式,如 <p style="color:red;">内联样式</ ...

  6. Nuxtjs初始

    今天去看vue的官网,才看了他的升级版-->Nuxtjs,https://nuxtjs.org/guide/installation可以点击链接进入他的官网查看文档 第一步,搭建项目之前的准备工 ...

  7. 使用Spark下的corr计算皮尔森相似度Pearson时,报错Can only zip RDDs with same number of elements in each partition....

    package com.huawei.bigdata.spark.examples import org.apache.spark.mllib.stat.Statistics import org.a ...

  8. LeetCode69.x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  9. MYSQL5.6.X 非在线安装版(解压版)安装过程

    一.卸载以前旧版本(本人5.5版本) 1.关闭MySQL服务 以管理员身份运行cmd,执行以下命令: net stop mysql 或者右键我的电脑,在管理——服务——停止MySQL 2.卸载MySQ ...

  10. 5.无监督学习-DBSCAN聚类算法及应用

    DBSCAN方法及应用 1.DBSCAN密度聚类简介 DBSCAN 算法是一种基于密度的聚类算法: 1.聚类的时候不需要预先指定簇的个数 2.最终的簇的个数不确定DBSCAN算法将数据点分为三类: 1 ...