乙個守護程序通常補認為是乙個不對終端進行控制的後台任務。它有三個很顯著的特徵:在後台執行,與啟動他的程序脫離,無須控制終端。常用的實現方式是fork() -> setsid() -> fork()
在glibc裡有乙個函式daemon。呼叫此函式,就可使當前程序脫離終端變成乙個守護程序,具體內容參見man daemon。php中暫時沒有此函式,php程式實現守護程序化有2種方法:
nohup php myprog.php > log.txt &
&
,這樣執行程式雖然也是轉為後台執行,但實際上是依賴終端的,當使用者退出終端時程序就會被殺掉。需要使用nohup來實現
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 78//實現守護程序步驟
9void crete_daemon(void)10
1819
if (pid > 0)20
2425
//2.
26//
執行到這裡就是子程序
27//
setsid 將當前程序設定為乙個新的會話期session,目的就是
28//
讓當前程序脫離控制台,成為守護程序。
29 pid =setsid();
30if (pid < 0)31
3536
//3.設定當前程序的工作目錄為根目錄,不依賴於其他
37 chdir("/"
);38
39//
4.umask設定為0確保將來程序有最大的檔案操作許可權
40 umask(0
);41
42//
5.關閉檔案描述符
43//
先要獲取當前系統中所允許開啟的最大檔案描述符數目
44int i = 0;45
int cnt =sysconf(_sc_open_max);
46for (i=0;i)
4750
51//
將0,1,2定位到 /dev/null
52 open("
/dev/null
",o_rdwr);
53 open("
/dev/null
",o_rdwr);
54 open("
/dev/null
",o_rdwr);
5556}57
58int main(void)59
6869
return0;
70 }
/*測試結果: 守護程序: 這裡較為關鍵的二個php函式是pcntl_fork()和posix_setsid()其它事項說明:*根據c語言的實現思路即可。
* 因為需要關閉 標準io,所以這裡使用redis方便測試。 */
<?php
//php**實現守護程序
function
daemon()
elseif($pid > 0)
//執行到這裡就是子程序
//2.建立乙個有別於終端的新session以脫離終端
$sid =posix_setsid();
if (!$sid
)
//這一部不是必須的
$pid =pcntl_fork();
if($pid
< 0)
elseif($pid > 0)
//3.設定當前程序的工作目錄為根目錄,不依賴於其他
chdir("/");
設定為0確保將來程序有最大的檔案操作許可權
umask(0);
//5.關閉標準i/o流
if (defined('stdin'))
fclose
(stdin);
if (defined('stdout'))
fclose
(stdout);
if (defined('stderr'))
fclose
(stderr);
}daemon();
$redis = new
redis();
$redis->connect('127.0.0.1', 6379);
while (true
)
PHP守護程序化
什麼是守護程序?乙個守護程序通常補認為是乙個不對終端進行控制的後台任務。它有三個很顯著的特徵 在後台執行,與啟動他的程序脫離,無須控制終端。常用的實現方式是fork setsid fork 根據 語言的實現思路即可。因為需要關閉 標準io,所以這裡使用redis方便測試。php 實現守護程序 fun...
PHP程式守護程序化
php命令列程式實現守護程序化有2種方法 nohup php myprog.php log.txt 這裡就實現了守護程序化。單獨執行 php myprog.php,當按下ctrl c時就會中斷程式執行,會kill當前程序以及子程序。php myprog.php 這樣執行程式雖然也是轉為後台執行,實際...
PHP程式守護程序化
php命令列程式實現守護程序化有2種方法 nohup php myprog.php log.txt 這裡就實現了守護程序化。單獨執行 php myprog.php,當按下ctrl c時就會中斷程式執行,會kill當前程序以及子程序。php myprog.php 這樣執行程式雖然也是轉為後台執行,實際...