公司在做遊戲伺服器合併的時候,對大批量資料表做了合併操作,難免會出現資料格式不一致問題。根據玩家反映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)/10); //fork 9個程式 程式太多,可能會導致伺服器系統資源耗盡而崩潰,所以必須控制程式數量 for($i = 0; $i < $x_count; ++$i) { $pids[$i] = pcntl_fork(); if($pids[$i] == -1) { die('fork error'); } else if ($pids[$i]) { //父程式邏輯 pcntl_wait($status, WNOHANG); } else { //子程式邏輯 $start = $i * 10; $tmp_users = array_splice($all_user, $start, 10); 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) * 1000; //計算差值 毫秒 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[0]['id'];
$return_arr = [];
foreach ($log as $lv) {
foreach ($show as $sv) {
$num = intval(substr((string)$sv['id'], 12, 4)); //show id ,拿來對比log的fid
if ($num == $lv['fid'] ) {
$arr = [];
$log_len = strlen((string)$lv['fid']);
$cha = 16 - $log_len;
if (intval($cha) > 0) {
$tou = (string)(substr($test, 0, $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
開始記憶體:385520
[頁面執行時間:160.7940196991]毫秒
執行後記憶體:399096
使用的記憶體:13576
回到正常記憶體:399096
單程式例項
<?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[0]['id'];
$return_arr = [];
foreach ($log as $lv) {
foreach ($show as $sv) {
$num = intval(substr((string)$sv['id'], 12, 4)); //show id ,拿來對比log的fid
if ($num == $lv['fid'] ) {
$arr = [];
$log_len = strlen((string)$lv['fid']);
$cha = 16 - $log_len;
if (intval($cha) > 0) {
$tou = (string)(substr($test, 0, $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) * 1000; //計算差值 毫秒
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
開始記憶體:398768
[頁面執行時間:9905.3988456726]毫秒
執行後記憶體:423736
使用的記憶體:24968
回到正常記憶體:423736
測試結果明顯對比,記憶體和執行時間....這裡只是簡單測試。
兩個資料表
連結:https://pan.baidu.com/s/1ursYdiFB5wCbUf2mfBnWUA 密碼:zhta