You've already forked qlg.tsgz.moe
							
							
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| $redirect_stdout = false;
 | |
| $workers = [];
 | |
| $worker_num = 1;
 | |
| 
 | |
| //swoole_process::daemon(0, 1);
 | |
| for($i = 0; $i < $worker_num; $i++)
 | |
| {
 | |
|     $process = new swoole_process('child_async', $redirect_stdout);
 | |
|     $process->id = $i;
 | |
|     $pid = $process->start();
 | |
|     $workers[$pid] = $process;
 | |
|     //echo "Master: new worker, PID=".$pid."\n";
 | |
| }
 | |
| 
 | |
| master_async($workers);
 | |
| //master_sync($workers);
 | |
| 
 | |
| //异步主进程
 | |
| function master_async($workers)
 | |
| {
 | |
|     swoole_process::signal(SIGCHLD, function ($signo) use (&$workers) {
 | |
|         while(1)
 | |
|         {
 | |
|             $ret = swoole_process::wait(false);
 | |
|             if ($ret)
 | |
|             {
 | |
|                 $pid = $ret['pid'];
 | |
|                 $child_process = $workers[$pid];
 | |
|                 //unset($workers[$pid]);
 | |
|                 echo "Worker Exit, kill_signal={$ret['signal']} PID=" . $pid . PHP_EOL;
 | |
|                 $new_pid = $child_process->start();
 | |
|                 $workers[$new_pid] = $child_process;
 | |
|                 unset($workers[$pid]);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 break;
 | |
|             }
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     /**
 | |
|      * @var $process swoole_process
 | |
|      */
 | |
|     foreach($workers as $pid => $process)
 | |
|     {
 | |
|         swoole_event_add($process->pipe, function($pipe) use ($process) {
 | |
|             $recv = $process->read();
 | |
|             if ($recv) echo "From Worker: " . $recv;
 | |
|             $process->write("HELLO worker {$process->pid}\n");
 | |
|         });
 | |
|         $process->write("hello worker[$pid]\n");
 | |
|     }
 | |
| }
 | |
| 
 | |
| //同步主进程
 | |
| function master_sync($workers)
 | |
| {
 | |
|     foreach($workers as $pid => $process)
 | |
|     {
 | |
|         $process->write("hello worker[$pid]\n");
 | |
|         echo "From Worker: ".$process->read();
 | |
|     }
 | |
| }
 | |
| 
 | |
| function child_sync(swoole_process $worker)
 | |
| {
 | |
|     //echo "Worker: start. PID=".$worker->pid."\n";
 | |
|     //recv data from master
 | |
|     $recv = $worker->read();
 | |
| 
 | |
|     echo "From Master: $recv\n";
 | |
| 
 | |
|     //send data to master
 | |
|     $worker->write("hello master\n");
 | |
| 
 | |
|     sleep(2);
 | |
|     $worker->exit(0);
 | |
| }
 | |
| 
 | |
| function child_async(swoole_process $worker)
 | |
| {
 | |
|     //echo "Worker: start. PID=".$worker->pid."\n";
 | |
|     //recv data from master
 | |
|     $GLOBALS['worker'] = $worker;
 | |
|     global $argv;
 | |
|     $worker->name("{$argv[0]}: worker #".$worker->id);
 | |
| 
 | |
|     swoole_process::signal(SIGTERM, function($signal_num) use ($worker) {
 | |
| 		echo "signal call = $signal_num, #{$worker->pid}\n";
 | |
|     });
 | |
| 
 | |
| //    swoole_timer_tick(2000, function () use ($worker)
 | |
| //    {
 | |
| //        if (rand(1, 3) % 2) {
 | |
| //            $worker->write("hello master {$worker->pid}\n");
 | |
| //        }
 | |
| //    });
 | |
| 
 | |
|     swoole_event_add($worker->pipe, function($pipe) use($worker) {
 | |
|         $recv = $worker->read();
 | |
|         echo "From Master: $recv\n";
 | |
|         //$worker->write("hello master\n");
 | |
|     });
 | |
| }
 |