[ 起源 ]
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下的父程序被殺掉,子程序就轉到後台執行,為了不在終端產...