[ 起源 ]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
然後寫入如下**:
#! /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做伺服器端,然後一直後台執行,達到伺服器端daemon的效果。
$ vi php_daemon2.php
輸入如下**(**來自php 手冊,我進行了修改注釋):
#! /usr/local/php/bin/php
<?php
/* 設定不顯示任何錯誤 */
error_reporting(0);
/* 指令碼超時為無限 */
set_time_limit(0);
/* 開始固定清除 */
ob_implicit_flush();
/* 本機的ip和需要開放的埠 */
$address = '192.168.0.1';
$port = 10000;
/* 產生乙個socket */
if (($sock = socket_create(af_inet, sock_stream, sol_tcp)) < 0)
/* 把ip位址埠進行繫結 */
if (($ret = socket_bind($sock, $address, $port)) < 0)
/* 監聽socket連線 */
if (($ret = socket_listen($sock, 5)) < 0)
/* 永遠迴圈監接受使用者連線 */
do /* 傳送提示資訊給連線上來的使用者 */
$msg = "****************************************==/r/n" .
" welcome to the php test server. /r/n/r/n".
" to quit, type 'quit'. /r/n" .
" to shut down the server type 'shutdown'./r/n" .
" to get help message type 'help'./r/n" .
"****************************************==/r/n" .
"php> ";
socket_write($msgsock, $msg, strlen($msg));
do if (!$buf = trim($buf))
/* 客戶端輸入quit命令時候關閉客戶端連線 */
if ($buf == 'quit')
/* 客戶端輸入shutdown命令時候服務端和客戶端都關閉 */
if ($buf == 'shutdown')
/* 客戶端輸入help命令時候輸出幫助資訊 */
if ($buf == 'help')
/* 客戶端輸入命令不存在時提示資訊 */
$talkback = "php: unknow command '$buf'./r/nphp> ";
socket_write($msgsock, $talkback, strlen($talkback));
echo "$buf/n";
} while (true);
socket_close($msgsock);
} while (true);
/* 關閉socket連線 */
socket_close($sock);
?>
儲存以上**退出。
上面的**大致就是完成乙個類似於telnet伺服器端的功能,就是當伺服器端執行該程式的時候,客戶端能夠連線該伺服器的10000埠進行通訊。
加上檔案的可執行許可權:
$ chmod +x /home/heiyeluren/php_daemon2.php
在伺服器上執行命令:
$ nohup /home/heiyeluren/php_daemon2.php &
就進入了後台執行,我們通過windows的客戶端telnet上去:
c:/>telnet 192.168.0.1 10000
正在連線到192.168.0.188...不能開啟到主機的連線, 在埠 10000: 連線失敗
****************************************==
welcome to the php test server.
to quit, type 'quit'.
to shut down the server type 'shutdown'.
to get help message type 'help'.
****************************************==
php>
php> asdf
php: unknow command 'asdf'.
執行help命令可以獲取幫助
php> help
php server help message
to quit, type 'quit'.
to shut down the server type 'shutdown'.
to get help message type 'help'.
這個伺服器端就不介紹了,可以自行擴充套件。
殺程序跟例子一類似。
[ 總結 ]通過以上學習,我們知道php也可以做守護程序,如果設計的好,功能也會比較強大,不過我們這裡只是學習而已,可以自行研究更新。
使用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下的父程序被殺掉,子程序就轉到後台執行,為了不在終端產...