PHP 多进程示例

PHP多进程示例

说明:读取库中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.'秒';
  • 执行结果:

image

讨论数量: 4

学习一下

4年前 评论

学习完毕,打卡

<?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 . '秒';
4年前 评论
WytheHuang

多进程, yield协程需要好好学习, 感谢楼主分享~

4年前 评论
lmaster

不论,什么语言在多进程或者多线程下(只读不写)读还好,一旦涉及写就复杂了

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!