一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

php守護進程 加linux命令nohup實現(xiàn)任務(wù)每秒執(zhí)行一次

Unix中 nohup 命令功能就是不掛斷地運行命令,同時 nohup 把程序的所有輸出到放到當(dāng)前目錄 nohup.out 文件中,如果文件不可寫,則放到 <用戶主目錄>/nohup.out 文件中。那么有了這個命令以后我們php就寫成shell 腳本使用循環(huán)來讓我們腳本一直運行下去,不管我們終端窗口是否關(guān)閉都能夠讓我們php 腳本一直運行下去。
馬上動手寫個 php 小程序,功能為每30秒記錄時間,寫入到文件
復(fù)制代碼 代碼如下:
# vi for_ever.php
#! /usr/local/php/bin/php
define('ROOT', dirname(__FILE__).'/');
set_time_limit(0);
while (true) {
file_put_contents(ROOT.'for_ever.txt', date('Y-m-d H:i:s')."/n", FILE_APPEND);
echo date('Y-m-d H:i:s'), ' OK!';
sleep(30);
}
?>

保存退出,然后賦予 for_ever.php 文件可執(zhí)行權(quán)限:
# chmod +x for_ever.php
讓它在再后臺執(zhí)行:
# nohup /home/andy/for_ever.php.php &
記得最后加上 & 符號,這樣才能夠跑到后臺去運行
執(zhí)行上述命令后出現(xiàn)如下提示:
[1] 5157
nohup: appending output to 'nohup.out'
所有命令執(zhí)行輸出信息都會放到 nohup.out 文件中
這時你可以打開 for_ever.php 同目錄下的 for_ever.txt 和 nohup.out 看看效果!
好了,它會永遠(yuǎn)運行下去了,怎么結(jié)束它呢?
# ps
PID TTY TIME CMD
4247 pts/1 00:00:00 bash
5157 pts/1 00:00:00 for_ever.php
5265 pts/1 00:00:00 ps
# kill -9 5157
找到進程號 5157 殺之,你將看到
[1]+ Killed nohup /home/andy/for_ever.php
OK!
====================
在很多項目中,或許有很多類似的后端腳本需要通過crontab定時執(zhí)行。比如每10秒檢查一下用戶狀態(tài)。腳本如下:
@file: /php_scripts/scan_userstatus.php
復(fù)制代碼 代碼如下:
#!/usr/bin/env php -q
$status = has_goaway();
if ($status) {
//done
}
?>

通過crontab定時執(zhí)行腳本scan_userstatus.php
#echo “*:*/10 * * * * /php_scripts/scan_userstatus.php
這樣,每隔10秒鐘,就會執(zhí)行該腳本。
我們發(fā)現(xiàn),在短時間內(nèi),該腳本的內(nèi)存資源還沒有釋放完,又啟用了新的腳本。也就是說:新腳本啟動了,舊腳本占用的資源還沒有如愿釋放。如此,日積月累,浪費了很多內(nèi)存資源。我們對這個腳本進行了一下改進,改進后如下:
@file: /php_scripts/scan_userstatus.php
復(fù)制代碼 代碼如下:
#/usr/bin/env php -q
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
?>

這樣,不需要crontab了。可以通過以下命令執(zhí)行腳本,達到相同的功能效果
#chmod +x /php_scripts/scan_userstatus.php
#nohup /php_scripts/scan_userstatus.php &
在這里,我們通過&將腳本放到后臺運行,為了防止隨著終端會話窗口關(guān)閉進程被殺,我們使用了nohup命令。那么有沒有辦法,不使nohup命令,也能夠運行呢,就像Unin/Linux Daemon一樣。接下來,就是我們要講的守護進程函數(shù)。
什么是守護進程?一個守護進程通常補認(rèn)為是一個不對終端進行控制的后臺任務(wù)。它有三個很顯著的特征:在后臺運行,與啟動他的進程脫離,無須控制終端。常用的實現(xiàn)方式是fork() -> setsid() -> fork() 詳細(xì)如下:
@file: /php_scripts/scan_userstatus.php
復(fù)制代碼 代碼如下:
#/usr/bin/env php -q
daemonize();
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
function daemonize() {
$pid = pcntl_fork();
if ($pid === -1 ) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(); //exit parent
}
chdir("/");
umask(0);
$sid = posix_setsid();
if (!$sid) {
return FALSE;
}
$pid = pcntl_fork();
if ($pid === -1) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(0);
}
if (defined('STDIN')) {
fclose(STDIN);
}
if (defined('STDOUT')){
fclose(STDOUT);
}
if (defined('STDERR')) {
fclose(STDERR);
}
}
?>

實現(xiàn)了守護進程函數(shù)以后,則可以建立一個常駐進程,所以只需要執(zhí)行一次:
#/php_scripts/scan_userstatus.php
這里較為關(guān)鍵的二個php函數(shù)是pcntl_fork()和posix_setsid()。fork()一個進程,則表示創(chuàng)建了一個運行進程的副本,副本被認(rèn)為是子進程,而原始進程被認(rèn)為是父進程。當(dāng)fork()運行之后,則可以脫離啟動他的進程與終端控制等,也意味著父進程可以自由退出。 pcntl_fork()返回值,-1表示執(zhí)行失敗,0表示在子進程中,而返進程ID號,則表示在父進程中。在這里,退出父進程。setsid(),它首先使新進程成為一個新會話的“領(lǐng)導(dǎo)者”,最后使該進程不再控制終端,這也是成為守護進程最關(guān)鍵的一步,這意味著,不會隨著終端關(guān)閉而強制退出進程。對于一個不會被中斷的常駐進程來說,這是很關(guān)鍵的一步。進行最后一次fork(),這一步不是必須的,但通常都這么做,它最大的意義是防止獲得控制終端。(在直接打開一個終端設(shè)備,而且沒有使用O_NOCTTY標(biāo)志的情況下, 會獲得控制終端).
其它事項說明:
1) chdir() 將守護進程放到總是存在的目錄中,另外一個好處是,你的常駐進程不會限制你umount一個文件系統(tǒng)。
2)umask() 設(shè)置文件模式,創(chuàng)建掩碼到最大的允許限度。如果一個守護進程需要創(chuàng)建具有可讀,可寫權(quán)限的文件,一個被繼承的具有更嚴(yán)格權(quán)限的掩碼會有反作用。
3)fclose(STDIN), fclose(STDOUT), fclose(STDERR) 關(guān)閉標(biāo)準(zhǔn)I/O流。注意,如果有輸出(echo),則守護進程會失敗。所以通常將STDIN, STDOUT, STDERR重定向某個指定文件.

php技術(shù)php守護進程 加linux命令nohup實現(xiàn)任務(wù)每秒執(zhí)行一次,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本一区二区三区久久久 | 亚洲狠狠婷婷综合久久久久网站 | 日韩在线视频中文字幕 | 91在线在线啪永久地址 | 国产福利不卡 | 小毛片| 精品伊人久久香线蕉 | 天天操91 | 国色天香精品亚洲精品 | 国产一区二区三区精品视频 | 38pao强力打造永久免费高清视频 | 天天在线影院天天在线视频 | 色综合久久综合欧美综合图片 | 久久亚洲视频 | 91在线成人 | 国产在线观看一区二区三区 | 国产成人一区在线播放 | 国产色手机在线观看播放 | 成人亚洲网站 | 国产美女一区二区在线观看 | 五月婷婷丁香久久 | 亚洲乱亚洲乱妇41p国产成人 | 日本精品一区二区三区在线视频| 成年美女网站 | 成人免费福利 | 午夜福利国产一级毛片 | 久久久久久久国产精品 | 国产成人禁片免费观看 | 久久精品视频2 | 日韩在线视频中文字幕 | 日本加勒比中文字幕 | 欧美日韩一区二区三区久久 | 国产爆操 | 激情五月社区 | 四虎网站网址 | 国产免费美女视频 | 伊人网综合视频 | 国产男女视频在线观看 | 精品日韩一区二区三区视频 | 亚洲欧美黄 | 黄色高清视频 |