使用PHP做Linux Unix守護程序

2021-08-25 18:32:04 字數 4823 閱讀 9854

[ 起源 ]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

pidttstat time command

82374p3ss 0:00.14 -bash (bash)

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

82528p3r+ 0:00.00 ps

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

$ kill -9 82510

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

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

$ ps

pidttstat time command

82374p3ss 0:00.17 -bash (bash)

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