在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一.概述 项目是棋牌,web架构是典型的lnmp,server产生的牌局通过http协议请求webserver,由php分析并持久化到mysql,中间参杂了很多业务逻辑,整个流程耗时平均接近2s。
二.改进方式 后面改由server把牌局数据写到redis队列里,php使用守护进程处理redis队列。 define('LEN', 50);//单进程处理牌局队列长度 define('PROC_MIN', 2);//最小进程数 define('PROC_MAX', 5);//最大进程数 ini_set('memory_limit', '128M'); umask(002); set_time_limit(0);//cli模式非必须 $daemonNum = (int) `ps -ef | grep "gamelog.php" | grep -v grep | awk '$3 == 1 {print $2}' | wc -l`;//当前守护进程数 $appGameLog = app::gamelog(); $appRedis = app::redis('log'); $key = akey::gamelog(); $len = $appRedis->lSize($key); $wokerNum = ceil($len / LEN);//需要的进程数 ($wokerNum < PROC_MIN) && ($wokerNum = PROC_MIN); if($daemonNum < $wokerNum){//守护进程数小于需要开启的进程数 $procNum = $wokerNum - $daemonNum; $procNum = min($procNum, PROC_MAX); $procNum = max($procNum, PROC_MIN); for($p = 1; $p <= $procNum; $p++){ $pid = pcntl_fork(); if($pid == 0){ posix_setsid(); while(true){ $data = $appRedis->rPop($key); //此处处理业务 } exit; }else if($pid > 0){ }else{ exit("fork error"); } } }else if($daemonNum > $wokerNum){//进程数过多自行kill $pidStr = `ps -ef | grep "gamelog.php" | grep -v grep | awk '$3 == 1 {print $2}'`; $aPid = explode(PHP_EOL, $pidStr); $wokerNum = max($wokerNum, PROC_MIN);//最少保留PROC_MIN个守护进程 $killNum = $daemonNum - $wokerNum; foreach($aPid as $pid){ $pid = (int) $pid; if($pid <= 0){ continue; } if(posix_kill($pid, SIGKILL)){ if(--$killNum <= 0){ break; } } } } php执行shell命令除了system(),exec(),还可以使用``。
三.改进后的效果 |
2022-08-17
2022-09-18
2022-08-17
2022-07-29
2022-08-15
请发表评论