php实现 master-worker 守护多进程模式的实例代码。
<?php
/**
* Class Worker
* php实现 master-worker 守护多进程模式的实例代码
* @link https://www.maopiaopiao.com/
* @author www.maopiaopiao.com
*/
class Worker {
public static $count = 2;
public static function run() {
static::runMaster();
static::monitorWorkerProcess();
}
/**
* 开启主进程
* @throws Exception
*/
public static function runMaster() {
//确保进程有最大操作权限
umask(0);
$pid = pcntl_fork();
if ($pid > 0) {
echo "主进程进程 $pid\r\n";
exit;
} else if ($pid == 0) {
if (-1 === posix_setsid()) {
echo "setsid fail\r\n";
throw new Exception("setsid fail");
}
for ($i = 0; $i < self::$count; $i++) {
static::runWorker();
}
cli_set_process_title("master_process");
} else {
throw new Exception("创建主进程失败");
}
}
/**
* 开启子进程
* @throws Exception
*/
public static function runWorker() {
umask(0);
$pid = pcntl_fork();
if ($pid > 0) {
echo "创建子进程 $pid \r\n";
} else if ($pid == 0) {
if (-1 === posix_setsid()) {
throw new Exception("setsid fail");
}
cli_set_process_title("worker_process");
self::doJob();
} else {
throw new Exception("创建子进程失败");
}
}
/**
* 监控worker进程
* @throws Exception
*/
public static function monitorWorkerProcess() {
while ($pid = pcntl_wait($status)) {
if ($pid == -1) {
break;
} else {
static::runWorker();
}
}
}
/**
* 业务逻辑
*/
public static function doJob() {
while (1) {
sleep(3);
echo '进程:' . posix_getpid() . ' ' . date('Y-m-d H:i:s') . '输出' . "\r\n";
}
}
}
Worker::run();