一個守護進程一般補認爲是一個不對終端進行控制的後臺任務。它有三個很顯著的特徵:在後臺運行,與啓動他的進程脫離,無須控制終端。經常使用的實現方式是fork() -> setsid() -> fork()
php
在glibc裏有一個函數daemon。調用此函數,就可以使當前進程脫離終端變成一個守護進程,具體內容參見man daemon。PHP中暫時沒有此函數,PHP程序實現守護進程化有2種方法:session
nohup php myprog.php > log.txt &
函數
&
,這樣執行程序雖然也是轉爲後臺運行,但其實是依賴終端的,當用戶退出終端時進程就會被殺掉。須要使用nohup來實現code
<?php function daemon() { $pid = pcntl_fork(); if($pid < 0){ die("fork(1) failed!\n"); }elseif($pid > 0){ exit; //讓終端啓動的進程退出 } chdir("/"); //改變當前目錄爲根目錄 umask(0); //重設文件權限掩碼 //創建一個有別於終端的新session以脫離終端 $sid = posix_setsid(); if (!$sid) { die("setsid failed!\n"); } $pid = pcntl_fork(); if($pid < 0){ die("fork(1) failed!\n"); }elseif($pid > 0){ exit; //父進程退出, 剩下子進程成爲最終的獨立進程 } //關閉標準I/O流 if (defined('STDIN')) { fclose(STDIN); } if (defined('STDOUT')){ fclose(STDOUT); } if (defined('STDERR')) { fclose(STDERR); } } daemon(); sleep(1000);
這裏較爲關鍵的二個php函數是pcntl_fork()和posix_setsid()繼承
其它事項說明:進程