async_master.php 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. $workers = [];
  3. $worker_num = 10;
  4. //swoole_process::daemon(0, 1);
  5. function onReceive($pipe) {
  6. global $workers;
  7. $worker = $workers[$pipe];
  8. $data = $worker->read();
  9. echo "RECV: " . $data;
  10. }
  11. //循环创建进程
  12. for($i = 0; $i < $worker_num; $i++)
  13. {
  14. $process = new swoole_process(function(swoole_process $process)
  15. {
  16. swoole_process::signal(SIGTERM, function($signal_num) use ($process) {
  17. echo "signal call = $signal_num, #{$process->pid}\n";
  18. });
  19. $i = 1;
  20. while($i++)
  21. {
  22. $process->write("Worker#{$process->id}: hello master\n");
  23. if ($i > 5 and $process->id == 1) $process->exit();
  24. sleep(1);
  25. }
  26. });
  27. $process->id = $i;
  28. $pid = $process->start();
  29. $workers[$process->pipe] = $process;
  30. }
  31. swoole_process::signal(SIGCHLD, function(){
  32. //表示子进程已关闭,回收它
  33. $status = swoole_process::wait();
  34. echo "Worker#{$status['pid']} exit\n";
  35. });
  36. swoole_process::signal(SIGTERM, function($signal_num) {
  37. echo "signal call = $signal_num \n";
  38. });
  39. //将子进程的管道加入EventLoop
  40. foreach($workers as $process)
  41. {
  42. swoole_event_add($process->pipe, 'onReceive');
  43. }