
说明:读取库中 10 万条记录,对其进行修改,测试结果对比,单进程修改完花费 40 秒左右, 创建了 4 个进程同步修改花费大概 10 秒左右。
代码示例:
$processNum = 4; $timeStart = time(); $mysqli = new mysqli('127.0.0.1' , 'root' , 'root' , 'test'); $result = $mysqli->query('select * from send_msg where status = 2'); $child = []; while($row = $result->fetch_array(MYSQLI_ASSOC)){ //这里讲返回的结果对4进行取模,存入4个数组,然后4个进程分别读取不同的数据进行处理 $child[$row['id']%$processNum][] = $row['id']; } $mainPid = posix_getpid(); echo "主进程:".$mainPid.PHP_EOL; for($i=0;$i<$processNum;$i++){ $pid = pcntl_fork(); if($pid == 0){ $content = $child[$i]; $childStart = time(); $mysqli = new mysqli('127.0.0.1' , 'root' , 'root' , 'test'); foreach($content as $id){ $mysqli->query('update send_msg set status=1 where id='.$id); } $childEnd = time(); $childDiff = $childEnd-$childStart; echo "#".posix_getpid()."执行完毕,用时:".$childDiff."秒".PHP_EOL; exit(); //子进程执行完后必须退出,否则会循环的创建进程... } } //这里挂起主进程,等待子进程全部退出后再退出主进程 while($processNum>0){ if(($pid = pcntl_wait($status)) > 0){ $processNum--; echo "#".$pid."退出".PHP_EOL; } } $timeEnd = time(); $diff = $timeEnd-$timeStart; echo '共计用时:'.$diff.'秒';
执行结果:
相似:
<?php $processNum = 4; $timeStart = time(); $tasks = range(1, 20); $jobs = []; foreach ($tasks as $task) { //这里讲返回的结果对4进行取模,存入4个数组,然后4个进程分别读取不同的数据进行处理 $jobs[$task % $processNum][] = $task; } $mainPid = posix_getpid(); echo "主进程:" . $mainPid . PHP_EOL; for ($i = 0; $i < $processNum; $i++) { $pid = pcntl_fork(); if ($pid == -1) { //错误处理:创建子进程失败时返回-1. die('could not fork'); } elseif ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 } else { // 子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 $content = $jobs[$i]; $childStart = time(); foreach ($content as $v2) { sleep(1); // 子进程执行的逻辑 } $childEnd = time(); $childDiff = $childEnd - $childStart; echo "#" . posix_getpid() . "执行完毕,用时:" . $childDiff . "秒" . PHP_EOL; exit(); // 子进程执行完后必须退出,否则会循环的创建进程... } } //这里挂起主进程,等待子进程全部退出后再退出主进程 while ($processNum > 0) { if ( pcntl_wait($status) > 0) { $processNum--; echo "#" . $pid . "退出" . PHP_EOL; } } $timeEnd = time(); $diff = $timeEnd - $timeStart; echo '共计用时:' . $diff . '秒';
还没有评论,来说两句吧...