<?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 協議》,轉載必須註明作者和本文連結