守護進程之PHP實現

什麼是守護進程

守護進程(daemon)是一種特殊的進程,它的生命週期很長,它在後臺運行而且沒有控制終端(這樣能夠保證守護進程不會接收到各類來自終端的信號)。
好比:crontab、sshd、nginx等,都會使用守護進程的形式運行,確保能夠一直正常的提供服務。php

如何實現守護進程

  • fork子進程,父進程退出(當前子進程會成爲init進程的子進程)
  • 子進程調用setsid(),開啓一個新會話,成爲新的會話組長,而且釋放於終端的關聯關係
  • 再次fork子進程,父進程退出(能夠防止會話組長從新申請打開終端)
  • 關閉打開的文件描述符
  • 改變當前工做目錄chdir
  • 清除進程的umask

PHP實現

/**
 * daemon(守護進程) PHP實現
 * @author zhjx922
 */

$pid = pcntl_fork();
if ($pid == -1) {
    die('建立子進程失敗');
} else if ($pid) {
    //第一次退出父進程
    exit(0);
}

//setsid
posix_setsid();

echo "成功輸出,脫離終端" . PHP_EOL;
sleep(5);

$pid = pcntl_fork();
if ($pid == -1) {
    die('建立子進程失敗');
} else if ($pid) {
    //第二次退出父進程(以前fork出來的子進程)
    exit(0);
}

echo "依然能夠輸出" . PHP_EOL;
sleep(5);

//關閉各類描述符
@fclose(STDOUT);
@fclose(STDERR);
$STDOUT = fopen('/dev/null', "a");
$STDERR = fopen('/dev/null', "a");

chdir('/');

umask(0);

echo "這裏不會輸出, ps aux | grep daemon.php 查看進程,20s後退出" . PHP_EOL;
sleep(20);

平常使用已經注意事項

  • php daemon.php & 這樣使用,當關閉終端後,當前php進程也會同時關掉
  • nohup php daemon.php > daemon.log & 終端關閉後,依然會繼續運行
  • 使用supervisor

開發了一個數獨小程序「惟一數獨」,歡迎掃描玩起來~

圖片描述

相關文章
相關標籤/搜索