首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實現守護進程(Daemon Process)標準流程

     編輯:PHP 相關知識

守護進程是在背景長期執行、不受終端機控制的進程。PHP 透過 pcntl_fork() 與 posix_setsid() 可建立標準的 Unix 守護進程,適用於常駐服務、佇列消費者、定時排程等場景。

三步驟建立守護進程

  1. Fork 子進程,父進程退出,讓子進程脫離終端機控制。
  2. 子進程呼叫 posix_setsid() 建立新會話,成為會話領導者,失去控制終端機。
  3. (可選)第二次 Fork 確保進程無法重新獲得控制終端機(雙重 Fork 模式)。

最小可行程式碼

<?php
$pid = pcntl_fork();
if ($pid < 0) {
    exit(1); // Fork 失敗
} elseif ($pid > 0) {
    exit(0); // 父進程退出
}

// 子進程繼續
$sid = posix_setsid();
if ($sid < 0) {
    exit(1); // 建立會話失敗
}

// 可選:切換工作目錄至根目錄,避免掛載點被佔用
chdir('/');
// 可選:關閉標準輸入/輸出/錯誤
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);

// 守護進程主迴圈
for ($i = 0; $i <= 60; $i++) {
    // 執行背景任務:檢查佇列、寫入日誌、監控服務等
    error_log("Daemon 執行中... 週期 $i");
    sleep(5);
}
?>

進階:雙重 Fork 確保完全脫離終端機

// 第一次 fork 後,子進程再 fork 一次
$pid2 = pcntl_fork();
if ($pid2 > 0) exit(0); // 第一代子進程退出
// 第二代子進程繼續執行 posix_setsid() 及主邏輯

部署建議

  • 使用 nohup php daemon.php >/dev/null 2>&1 & 或系統服務管理器(systemd、supervisord)管理啟動/重啟/日誌。
  • 記憶體洩漏防範:長期運行的迴圈中定期釋放大型變數,或使用 gc_collect_cycles()。
  • 訊號處理:註冊 pcntl_signal(SIGTERM, ...) 實現優雅關機。

掌握守護進程撰寫,是 PHP 進入系統級背景服務開發的關鍵門檻。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved