好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

示例代码:

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

public function index(Request $request)

    {

   pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。  

   $max = 8000;

   $workers = 10;

   

   $pids = array();

   for($i = 0; $i < $workers; $i++){

  $pids[$i] = pcntl_fork();

  $pid = posix_getpid();

  switch ($pids[$i]) {

 case -1:

echo "fork error : {$i} \r\n";

exit;

 case 0:

$param = array(

    'lastid' => $max / $workers * $i,

    'maxid' => $max / $workers * ($i+1),

);

$this->doSomething($pid, $param);

exit;

 default:

break;

  }

   }

   

   foreach ($pids as $i => $pid) {

  if($pid) {

 //父进程会得到子进程号,所以这里是父进程执行的逻辑  

 //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:  

 pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。

 //pcntl_waitpid($pid, $status);

  }

   }

    }



// 可以看到那个子进程在处理哪些数据

    public function doSomething($filename, $param)

    {

   for ($i = $param['lastid']; $i < $param['maxid']; $i++) {

  $path = "./test/";

  if (!is_dir($path)){

 mkdir($path, 0777, true);

  }
  $content = $i . '|';
  $file = $path . $filename . ".txt";
  file_put_contents($file, $content, FILE_APPEND);
   }
    }

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

以上就是PHP的Pcntl多进程扩展的用法介绍的详细内容,更多请关注Gxl网其它相关文章!

查看更多关于PHP的Pcntl多进程扩展的用法介绍的详细内容...

  阅读:39次