使用php來做守護程序

2021-09-07 23:48:51 字數 2457 閱讀 9801

[ 起源 ]

linux/unix下守護程序(daemon)大家都知道,比如我們常用的httpd、mysqld等等,就是常駐記憶體執行的程式,類似於windows下的服務。一般守護程序都是使用c/c++來寫,就是通過fork生成子程序,當前臺shell下的父程序被殺掉,子程序就轉到後台執行,為了不在終端產生輸出資訊,就通過syslog等函式來寫日誌檔案。

我們知道php是指令碼語言,通過php的指令碼引擎來執行,所以要做成守護程序比較麻煩,我們今天就來結合unix/linux的命令來實現我們守護程序的功能。

[ 原理 ]

unix中的nohup命令的功能就是不結束通話地執行命令,同時nohup把程式的所有輸出到放到當前目錄的nohup.out檔案中,如果檔案不可寫,則放到《使用者主目錄》/nohup.out 檔案中。那麼有了這個命令以後,我們的php程式就寫程shell指令碼,使用迴圈來讓我們的指令碼一直執行,那麼不管我們終端視窗是否關閉,都能夠讓我們的 php指令碼一直執行。當然,當我們的php程序被殺或者我們的作業系統重啟了,自然就會中止了。

[ 功能 ]

肯定會問,讓我們的php指令碼做了守護程序又有什麼用處呢?當然有,比如最典型的作用,能夠基本的替代cron的功能,比如我們需要定期實行的某些操作,完全可以交給它來做,不再需要cron,當然,如果伺服器重啟就沒有辦法了,不過,一般的unix伺服器不是那麼容易重啟的。另外,我們還可以做乙個簡單的伺服器端的功能,比如做乙個能夠telnet過去的伺服器,嘿嘿,可以做成乙個小後門,不過這樣實現稍微有點復

雜。[ 實踐 ]

例子:自動生成檔案

我們現在來做兩個例子來證明我們上面的說法。首先第乙個是每個三十秒自動生成乙個檔案,永遠執行下去。

首必須確保作業系統是unix或者linux,比如可以是freebsd、redhat、fedora或者suse什麼的。然後我們必須確保我們的 php指令碼引擎是在 /usr/local/php/bin/php,具體路徑可以按照你實際路徑來寫,如果沒有指令碼引擎,請自行安裝。

$ vi php_daemon1.php

然後寫入如下**:

雙擊**全選

1

2

3

4

5

6

7

8

9

#! /usr/local/php/bin/php

<?

set_time_limit(0);

while(1)

?>

然後儲存並且退出vi,然後賦予php_daemon1.php檔案可執行許可權:

$ chmod +x /home/heiyeluren/php_daemon1.php

然後再讓我們的指令碼再後台執行,執行如下命令:

$ nohup /home/heiyeluren/php_daemon1.php &

[1] 82480

再回後車後將出現shell提示符。那麼上面的提示就是說,所有命令執行的輸出資訊都會放到 nohup.out 檔案中,這個上面已經講了。然後執行上面命令後,我們每個三十秒在當前目錄就會看到多出以test_開頭的檔案,比如:test_1139901144.txt test_1139901154.txt等等檔案,那麼就證明我們的程式已經再後台執行了。

那麼我們如何終止程式的執行呢?最好辦法就是重啟作業系統,呵呵,當然,這是不可取的,我們可以使用kill命令來殺掉這個程序,殺程序之前自然後知道程序的pid號,就是process id,使用ps命令就能夠看到了。

$ ps

pid tt stat   time command

82374 p3 ss   0:00.14 -bash (bash)

82510 p3 s   0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php

82528 p3 r+   0:00.00 ps

上面我們已經看到了我們的php的程序id是:82510 ,於是我們再執行kill命令:

$ kill -9 82510

[1]+ killed         nohup /home/heiyeluren/php_daemon1.php

看到這麼提示就明白這個程序被殺了,再ps,就會發現沒有了:

$ ps

pid tt stat   time command

82374 p3 ss   0:00.17 -bash (bash)

82535 p3 r+   0:00.00 ps

如果直接ps命令無法看到程序,那麼就使用 ps & apos 兩個結合命令來檢視,一定能夠看到程序。

再上面的基礎上程序擴充套件,能夠做成屬於自己的cron程式,那就不需要cron啦,當然,這只是一種方式

使用PHP做Linux Unix守護程序

起源 linux unix 下守護程序 daemon 大家都知道,比如我們常用的httpd mysqld等等,就是常駐記憶體執行的程式,類似於windows下的服務。一般守護 程序都是使用c c 來寫,就是通過fork生成子程序,當前臺shell下的父程序被殺掉,子程序就轉到後台執行,為了不在終端產...

使用PHP做Linux Unix守護程序

起源 linux unix 下守護程序 daemon 大家都知道,比如我們常用的httpd mysqld等等,就是常駐記憶體執行的程式,類似於windows下的服務。一般守護 程序都是使用c c 來寫,就是通過fork生成子程序,當前臺shell下的父程序被殺掉,子程序就轉到後台執行,為了不在終端產...

使用PHP做Linux Unix守護程序

起源 linux unix 下守護程序 daemon 大家都知道,比如我們常用的httpd mysqld等等,就是常駐記憶體執行的程式,類似於windows下的服務。一般守護 程序都是使用c c 來寫,就是通過fork生成子程序,當前臺shell下的父程序被殺掉,子程序就轉到後台執行,為了不在終端產...