Created
June 5, 2015 11:17
-
-
Save guweigang/1fa9976c97bfd9a94a95 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$redirect_stdout = false; | |
$workers = []; | |
$worker_num = 8; | |
//swoole_process::daemon(0, 1); | |
for($i = 0; $i < $worker_num; $i++) | |
{ | |
$process = new swoole_process('child_async', $redirect_stdout); | |
$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']; | |
unset($workers[$pid]); | |
echo "Worker Exit, PID=" . $pid . PHP_EOL; | |
} | |
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[$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"); | |
swoole_process::signal(SIGTERM, function($signal_num) use ($worker) { | |
echo "signal call = $signal_num, #{$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"); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment