PHP实现master-worker守护多进程
<?php
/**
* master-worker守护多进程模式
*
*/
class Worker
{
//需要创建的子进程数量
public static $count = 2;
public static function main()
{
//创建主进程
static::createMaster();
//监控子进程
static::watchProcess();
}
/**
* 创建主进程
*/
public static function createMaster()
{
$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
//成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
if ($pid > 0) {
echo "创建主进程 $pid \n";
exit;
} else if ($pid == 0) {
//posix_setsid() 使当前进程成为会话的主进程,返回会话ID,如果错误则返回-1
if (posix_setsid() === -1) {
die("setsid 失败");
}
//设置进程标题
cli_set_process_title("master_process");
//创建子进程
for ($i = 0; $i < self::$count; $i++) {
static::createWorker();
}
} else {
die("创建主进程失败");
}
}
/**
* 创建子进程
*/
public static function createWorker()
{
$pid = pcntl_fork();
if ($pid > 0) {
echo "创建子进程 $pid \n";
} else if ($pid == 0) {
if (posix_setsid() === -1) {
die("setsid 失败");
}
//设置进程标题
cli_set_process_title("worker_process");
while (true) {
//echo '当前进程id '.posix_getpid()." 运行中\n";
sleep(2);
}
} else {
die("创建子进程失败");
}
}
/**
* 监控子进程
*/
public static function watchProcess()
{
//pcntl_wait()返回退出的子进程进程号,发生错误时返回-1
while ($pid = pcntl_wait($status)) {
if ($pid == -1) {
break;
} else {
static::createWorker();
}
}
}
}
Worker::main();
php Worker.php
ps -ef|grep _process
kill 6250
当某个子进程意外退出时,守护进程会再自动创建一个新的子进程
本作品采用《CC 协议》,转载必须注明作者和本文链接