Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. <?php
  2.  
  3. interface Processable
  4. {
  5. public function run();
  6. }
  7.  
  8. class ProcessTask implements Processable
  9. {
  10.  
  11. public function run()
  12. {
  13. echo 123 . PHP_EOL;sleep(rand(1, 5));
  14. }
  15. }
  16.  
  17. class Process implements Processable
  18. {
  19. public function __construct()
  20. {
  21.  
  22. }
  23.  
  24. public function run()
  25. {
  26.  
  27. }
  28. }
  29.  
  30. class ProcessPool
  31. {
  32. private $_processNum;
  33.  
  34. private $_processTask = array();
  35.  
  36. private $_pid = array();
  37.  
  38. public function __construct($processNum)
  39. {
  40. $this->setProcessNum($processNum);
  41. }
  42.  
  43. /**
  44. * @return mixed
  45. */
  46. public function getProcessNum()
  47. {
  48. return $this->_processNum;
  49. }
  50.  
  51. /**
  52. * @param mixed $_jobProcessNum
  53. */
  54. public function setProcessNum($processNum)
  55. {
  56. $this->_processNum = $processNum;
  57. }
  58.  
  59. /**
  60. * @param Processable $processableTask
  61. * @return mixed
  62. */
  63. public function addProcessTask(Processable $processableTask)
  64. {
  65. $this->_processTask[] = $processableTask;
  66. return array_pop(array_keys($this->_processTask));
  67. }
  68.  
  69. public function removeProcessTask($index)
  70. {
  71. unset($this->_processTask[$index]);
  72. }
  73.  
  74. public function addPid($pid)
  75. {
  76. $this->_pid[$pid] = $pid;
  77. }
  78.  
  79. public function getPid()
  80. {
  81. return $this->_pid;
  82. }
  83.  
  84. public function removePid($pid)
  85. {
  86. unset($this->_pid[$pid]);
  87. }
  88.  
  89. public function submit(Processable $processableTask)
  90. {
  91. $index = $this->addProcessTask($processableTask);
  92.  
  93. $jobProcessNum = $this->getProcessNum();
  94.  
  95. $pid = pcntl_fork();
  96. if ($pid == -1) {
  97. die("cannot fork");
  98. } else if ($pid) {
  99. $this->addPid($pid);
  100. $this->setProcessNum(--$jobProcessNum);
  101. if ($jobProcessNum == 0) {
  102. $pid = pcntl_wait($status);
  103. $this->removePid($pid);
  104. $this->setProcessNum(++$jobProcessNum);
  105. }
  106. } else {
  107. $processableTask->run();
  108. $this->removeProcessTask($index);
  109. exit();
  110. }
  111. }
  112.  
  113. public function shutdown()
  114. {
  115. while ($this->getPid()) {
  116. $pid = pcntl_wait($status);
  117. $this->removePid($pid);
  118. }
  119. }
  120. }
  121.  
  122. $processPool = new ProcessPool(3);
  123. $processPool->submit(new ProcessTask());
  124. $processPool->submit(new ProcessTask());
  125. $processPool->submit(new ProcessTask());
  126. $processPool->submit(new ProcessTask());
  127. $processPool->submit(new ProcessTask());
  128. $processPool->submit(new ProcessTask());
  129. $processPool->submit(new ProcessTask());
  130. $processPool->submit(new ProcessTask());
  131. $processPool->submit(new ProcessTask());
  132. $processPool->submit(new ProcessTask());
  133.  
  134. echo 'aaa' . PHP_EOL;
  135.  
  136. $processPool->shutdown();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement