worker.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. $redirect_stdout = false;
  3. $workers = [];
  4. $worker_num = 1;
  5. //swoole_process::daemon(0, 1);
  6. for($i = 0; $i < $worker_num; $i++)
  7. {
  8. $process = new swoole_process('child_async', $redirect_stdout);
  9. $process->id = $i;
  10. $pid = $process->start();
  11. $workers[$pid] = $process;
  12. //echo "Master: new worker, PID=".$pid."\n";
  13. }
  14. master_async($workers);
  15. //master_sync($workers);
  16. //异步主进程
  17. function master_async($workers)
  18. {
  19. swoole_process::signal(SIGCHLD, function ($signo) use (&$workers) {
  20. while(1)
  21. {
  22. $ret = swoole_process::wait(false);
  23. if ($ret)
  24. {
  25. $pid = $ret['pid'];
  26. $child_process = $workers[$pid];
  27. //unset($workers[$pid]);
  28. echo "Worker Exit, kill_signal={$ret['signal']} PID=" . $pid . PHP_EOL;
  29. $new_pid = $child_process->start();
  30. $workers[$new_pid] = $child_process;
  31. unset($workers[$pid]);
  32. }
  33. else
  34. {
  35. break;
  36. }
  37. }
  38. });
  39. /**
  40. * @var $process swoole_process
  41. */
  42. foreach($workers as $pid => $process)
  43. {
  44. swoole_event_add($process->pipe, function($pipe) use ($process) {
  45. $recv = $process->read();
  46. if ($recv) echo "From Worker: " . $recv;
  47. $process->write("HELLO worker {$process->pid}\n");
  48. });
  49. $process->write("hello worker[$pid]\n");
  50. }
  51. }
  52. //同步主进程
  53. function master_sync($workers)
  54. {
  55. foreach($workers as $pid => $process)
  56. {
  57. $process->write("hello worker[$pid]\n");
  58. echo "From Worker: ".$process->read();
  59. }
  60. }
  61. function child_sync(swoole_process $worker)
  62. {
  63. //echo "Worker: start. PID=".$worker->pid."\n";
  64. //recv data from master
  65. $recv = $worker->read();
  66. echo "From Master: $recv\n";
  67. //send data to master
  68. $worker->write("hello master\n");
  69. sleep(2);
  70. $worker->exit(0);
  71. }
  72. function child_async(swoole_process $worker)
  73. {
  74. //echo "Worker: start. PID=".$worker->pid."\n";
  75. //recv data from master
  76. $GLOBALS['worker'] = $worker;
  77. global $argv;
  78. $worker->name("{$argv[0]}: worker #".$worker->id);
  79. swoole_process::signal(SIGTERM, function($signal_num) use ($worker) {
  80. echo "signal call = $signal_num, #{$worker->pid}\n";
  81. });
  82. // swoole_timer_tick(2000, function () use ($worker)
  83. // {
  84. // if (rand(1, 3) % 2) {
  85. // $worker->write("hello master {$worker->pid}\n");
  86. // }
  87. // });
  88. swoole_event_add($worker->pipe, function($pipe) use($worker) {
  89. $recv = $worker->read();
  90. echo "From Master: $recv\n";
  91. //$worker->write("hello master\n");
  92. });
  93. }