PHP多程式非阻塞模式下結合原生Mysql與單程式效率測試對比

OldBoy~發表於2018-07-03

公司在做遊戲伺服器合併的時候,對大批量資料表做了合併操作,難免會出現資料格式不一致問題。根據玩家反映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

 

相關文章