Process.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. * 创建子进程
  4. * Created by PhpStorm.
  5. * User: leo
  6. * Date: 2018/8/23
  7. * Time: 下午4:23
  8. */
  9. namespace common\libs\swoole;
  10. class Process
  11. {
  12. public $processName;
  13. public $mpid=0;
  14. public $works=[];
  15. public $maxPrecess;
  16. public $new_index=0;
  17. /**
  18. * Process constructor.
  19. * @param $processName
  20. * @param int $workerNum
  21. * @throws \yii\base\Exception
  22. */
  23. public function __construct($processName, $workerNum = 5){
  24. try {
  25. @swoole_set_process_name($processName);
  26. $this->processName = $processName;
  27. $this->mpid = posix_getpid();
  28. $this->maxPrecess = $workerNum;
  29. }catch (\Exception $e){
  30. throw new \yii\base\Exception('ALL ERROR: '.$e->getMessage());
  31. }
  32. }
  33. /**
  34. * 运行
  35. * @param callable $callback
  36. */
  37. public function run(callable $callback){
  38. for ($i=0; $i < $this->maxPrecess; $i++) {
  39. $this->CreateProcess($callback, $i+1);
  40. }
  41. $this->processWait();
  42. }
  43. /**
  44. * 创建进程
  45. * @param callable $callback
  46. * @param $workId
  47. * @return int
  48. */
  49. public function CreateProcess(callable $callback, $workId){
  50. $process = new \Swoole\Process(function(\Swoole\Process $worker) use($callback, $workId){
  51. @swoole_set_process_name($this->processName.$workId);
  52. $callback($workId, $this->mpid);
  53. }, false, false);
  54. $pid=$process->start();
  55. $this->works[] = $pid;
  56. return $pid;
  57. }
  58. /**
  59. * 回收子进程
  60. */
  61. public function processWait(){
  62. while(1) {
  63. if(count($this->works)){
  64. $ret = \Swoole\Process::wait();
  65. if($ret){
  66. foreach($this->works as $key => $pid){
  67. if($pid == $ret['pid']){
  68. unset($this->works[$key]);
  69. }
  70. }
  71. }
  72. }else{
  73. break;
  74. }
  75. }
  76. }
  77. /**
  78. * 获取是否完成了全部子进程
  79. * @return bool
  80. */
  81. public function isFinish(){
  82. return !count($this->works);
  83. }
  84. }