当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2020-01-10 17:09:28 浏览: 评论:0 

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

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

示例代码:

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

  1. public function index(Request $request
  2.  
  3.     { 
  4.  
  5.         pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。 
  6.  
  7.         $max = 8000; 
  8.  
  9.         $workers = 10; 
  10.    
  11.         $pids = array(); 
  12.  
  13.         for($i = 0; $i < $workers$i++){ 
  14.  
  15.             $pids[$i] = pcntl_fork(); 
  16.  
  17.             $pid = posix_getpid(); 
  18.  
  19.             switch ($pids[$i]) {  
  20.  
  21.                 case -1: 
  22.  
  23.                     echo "fork error : {$i} \r\n" 
  24.  
  25.                     exit
  26.  
  27.  
  28.                 case 0:  
  29.  
  30.                     $param = array
  31.  
  32.  
  33.                         'lastid' => $max / $workers * $i
  34.  
  35.                         'maxid' => $max / $workers * ($i+1), 
  36.  
  37.  
  38.                     ); 
  39.  
  40.  
  41.                     $this->doSomething($pid$param); 
  42.  
  43.                     exit
  44.  
  45.  
  46.                 default
  47.  
  48.  
  49.                     break 
  50.  
  51.             } 
  52.  
  53.  
  54.         } 
  55.  
  56.  
  57.         foreach ($pids as $i => $pid) {  
  58.  
  59.             if($pid) {  
  60.  
  61.         //父进程会得到子进程号,所以这里是父进程执行的逻辑   
  62.  
  63.  
  64.       //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:   
  65.  
  66.  
  67.  
  68.       pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。 
  69.  
  70.  
  71.                 //pcntl_waitpid($pid, $status);  
  72.  
  73.             }  
  74.  
  75.         }  
  76.  
  77.     }     
  78.  
  79.  
  80. // 可以看到那个子进程在处理哪些数据  
  81.  
  82.     public function doSomething($filename$param 
  83.  
  84.     {  
  85.  
  86.         for ($i = $param['lastid']; $i < $param['maxid']; $i++) {  
  87.  
  88.             $path = "./test/"
  89.  
  90.  
  91.             if (!is_dir($path)){  
  92.  
  93.                 mkdir($path, 0777, true);  
  94.  
  95.             } 
  96.  
  97.             $content = $i . '|'
  98.  
  99.             $file = $path . $filename . ".txt"
  100.  
  101.             file_put_contents($file$content, FILE_APPEND); 
  102.  
  103.         } 
  104.  
  105.     } 

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

Tags: Pcntl

分享到: