A-A+

PHP的Pcntl多进程扩展的用法介绍

2020年01月11日 我爱编程 暂无评论

本篇文章给大家带来的内容是关于PHP的Pcntl多进程扩展的用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

PHP提供了一个Pcntl扩展,Pcntl基于Linux的进程,Windows系统暂时没有这个扩展,用于实现基础的多进程实现,可以利用这个处理一个很耗时的任务,例如发订阅邮件,短信,站内信等。

示例代码:

代码是基于Laravel 框架的,建议使用此框架来允许这部分代码。

  1. public function index(Request $request)
  2.     {
  3.         pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。
  4.         $max = 8000;
  5.         $workers = 10;
  6.         $pids = array();
  7.         for($i = 0; $i < $workers$i++){
  8.             $pids[$i] = pcntl_fork();
  9.             $pid = posix_getpid();
  10.             switch ($pids[$i]) {
  11.                 case -1:
  12.                     echo "fork error : {$i} \r\n";
  13.                     exit;
  14.                 case 0:
  15.                     $param = array(
  16.                         'lastid' => $max / $workers * $i,
  17.                         'maxid' => $max / $workers * ($i+1),
  18.                     );
  19.                     $this->doSomething($pid$param);
  20.                     exit;
  21.                 default:
  22.                     break;
  23.             }
  24.         }
  25.         foreach ($pids as $i => $pid) {
  26.             if($pid) {
  27.         //父进程会得到子进程号,所以这里是父进程执行的逻辑  
  28.       //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:  
  29.       pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。
  30.                 //pcntl_waitpid($pid, $status);
  31.             }
  32.         }
  33.     }
  34. // 可以看到那个子进程在处理哪些数据
  35.     public function doSomething($filename$param)
  36.     {
  37.         for ($i = $param['lastid']; $i < $param['maxid']; $i++) {
  38.             $path = "./test/";
  39.             if (!is_dir($path)){
  40.                 mkdir($path, 0777, true);
  41.             }
  42.             $content = $i . '|';
  43.             $file = $path . $filename . ".txt";
  44.             file_put_contents($file$content, FILE_APPEND);
  45.         }
  46.     }

更多建议读文档,进程和线程,还有很多内容的,需要读书去学习了。

标签:

给我留言

Copyright © 四季博客 保留所有权利.   Theme  Ality

用户登录