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)/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://www.cnblogs.com/zh718594493/p/12153733.html

时间: 2024-07-30 20:05:35

PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比的相关文章

非阻塞模式下connect 成功失败判断

将一个socket 设置成阻塞模式和非阻塞模式,使用fcntl方法,即: 设置成非阻塞模式: 先用fcntl的F_GETFL获取flags,用F_SETFL设置flags|O_NONBLOCK; 即: flags = fcntl(sockfd, F_GETFL, 0);                        //获取文件的flags值. fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);   //设置成非阻塞模式: 同时在接收和发送数据时,需要使用MS

非阻塞模式下网络读写接口返回值的处理

Cyassl库 https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-17-8-wolfssl-api-connection-session-io.html int CyaSSL_read(CYASSL* ssl, void* data, int sz); Return Values: > 0 - the number of bytes read upon success. 0 - will be returned upon failure.  This

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

有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server (客户端 / 服务端)的网络聊天和传输文件的程序 ( 详见: 源代码参考 ) ,在调试这些程序的过程中,追踪深入至 CSocket 类核心源码 Sockcore.cpp , 对于CSocket 类的运行机制可谓是一览无遗,并且对于阻塞和非阻塞方式下的 socket 程序的编写也是稍有体会. 阅读本

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

关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR:如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么

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

1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收.只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取 2.阻塞模式与非阻塞模式下writ

PHP非阻塞模式

PHP非阻塞模式 by 尘缘 on 七月 31st, 2014 // Filed Under → php 让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑. 帮助 01 02 03 04 05 06 07 08 09 10 echo"program start."; file_put_c

PHP非阻塞模式 (转自 尘缘)

让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑. 帮助 01 02 03 04 05 06 07 08 09 10 echo "program start."; file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'),

转:PHP非阻塞模式

你可以任意转摘“PHP非阻塞模式”,但请保留本文出处和版权信息.作者:尘缘,QQ:130775,来源:http://www.4wei.cn/archives/1002336 让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑. 帮助 01 02 03 04 05 06 07 08 09 10 ech

转:PHP中实现非阻塞模式

原文来自于:http://blog.csdn.net/linvo/article/details/5466046 程序非阻塞模式,这里也可以理解成并发.而并发又暂且可以分为网络请求并发 和本地并发 . 先说一下网络请求并发 理论描述 假设有一个client,程序逻辑是要请求三个不同的server,处理各自的响应.传统模型当然是顺序执行,先发送第一个请求,等待收到响应数据后再发送第二个请求,以此类推.就像是单核CPU,一次只能处理一件事,其他事情被暂时阻塞.而并发模式可以让三个server同时处理