ホームページ > バックエンド開発 > PHPチュートリアル > PHPで書かれたプロセスデーモン、プロセス管理、プロセスエラー自動起動機能、サーバー管理者向け_PHPチュートリアル

PHPで書かれたプロセスデーモン、プロセス管理、プロセスエラー自動起動機能、サーバー管理者向け_PHPチュートリアル

WBOY
リリース: 2016-07-14 10:10:19
オリジナル
1331 人が閲覧しました

phpコマンドラインツールをインストールするだけです

例を実行します:

phpvisor.php /usr/local/nginx/bin/nginxEveryone (この後に対応するコマンドのパラメータを追加することもできます。パラメータがない場合は空白のままにしてください) &


パラメータの概要: 1 つ目はコマンド ライン上の php 実行可能プログラム、2 つ目はこの記事の下にあるコード ファイル、3 つ目は起動する必要がある実行可能プログラムのパス、4 つ目は起動に使用するロール、および以下は予約済みパラメータであり、すべてこの実行可能プログラムに渡されます。

利点:

1. デーモン化する必要があるプログラムは非デーモン状態で実行され、エラーが発生して終了してもすぐに再起動できます

2. プログラムがデーモンとして実行されている場合、定期的に実行ステータスをチェックし、1 秒以内に再起動します

3. 一定期間内の再起動回数を設定でき、設定した回数を超えた場合は再起動しなくなり、特殊な状況によりアプリケーションが再起動できなくなることを防ぎます。


提案:

非デーモン状態で実行するようにプログラムを調整することをお勧めします。


次のコードをコピーし、visor.php ファイルとして保存します


[php]
//著者のメールアドレス:tipboy@qq.com
$_retry_times=5; $_retry_times_duration=60;//これは再起動された回数であり、再度再起動する必要はありません
$_times_arr=配列(); $args=$_SERVER['argv']
if(count($args)<3)
{
write_log("引数番号エラー!"); write_log("etc:phpvisor.php /usr/local/nginx/bin/nginxEveryone xxx"); write_log("最初のパラメータはこのファイル、2 番目のパラメータは監視する実行可能ファイルのパス、3 番目のパラメータは実行に使用するユーザー、次のパラメータは実行可能ファイルの実行に使用されるパラメータです");
終了(); }
//$args[0] はこのファイルの名前です
$path=$args[1]
$ユーザー名=$args[2]
for($i=3;$i>0;$i--)
array_shift($args)

while(1){
$pid=pcntl_fork(); If($pid==0)
{
//write_log("子 ".getmypid()." を実行します"); pcntl_exec($path,$args,$_SERVER); write_log("ファイルの実行に失敗しました"); 終了(0); }
else if($pid>0)
{
//write_log(" main pid:".getmypid().", child_pid:".$pid); $endpid=pcntl_waitpid($pid,$status,2); //write_log("ステータス:".$status);
If($status==0)
                                                            //バックグラウンドで実行されているデーモン プログラムである可能性があります
If(file_exists("/proc/".($pid+1)."/stat"))
                                                                //プロセスが存在し、定期的に判断する必要があることを示します
write_log("プログラム開始成功");                                                                                                                 ​                                                                       If(file_exists("/proc/".($pid+1)."/stat"))
                                                                         //write_log("プログラムは生きています"); _ usleep(1000000);                                                          それ以外                                                                          write_log("program die"); 壊す;                                                                                                                                                                                                                                                                   その他
                                                                //プロセスが存在せず、非デーモン状態ではないことを示します。
write_log("プログラムの開始に失敗しました"); 終了(0);                                                                        }
else if($status>0)
                                                            // デーモン プログラムではなく、終了したため再起動する必要があることを示します
write_log("プログラムダイ"); //続く; }
それ以外
                                                            終了(0); }

If(chk_need_start($_times_arr,$_retry_times_duration,$_retry_times))
                                                            続けてください;
}
それ以外
                                                            休憩
}
}
};

関数 write_log($msg)
{
Print(date('Y-m-d H:i:s').' '.$msg."n"); }

関数 chk_need_start(&$_times_arr,$_retry_times_duration,$_retry_times)
{
foreach($_times_arr as $k=>$v)
{
//write_log("期間:".$_retry_times_duration); If($k                                                             //write_log("設定を解除する"); unset($_times_arr[$k]);                                                                           }
//write_log("バッファ数:".count($_times_arr)); If(count($_times_arr)>=$_retry_times)
{

false を返します
}
それ以外は
{
$_times_arr[time()]=1;
true を返します
}
}
?>

//著者のメールアドレス:tipboy@qq.com
$_retry_times=5;
$_retry_times_duration=60; //これは再起動した回数と回数なので、再起動する必要はありません
$_times_arr=array();
$args=$_SERVER['argv'];
if(count($args)<3)
{
write_log("引数の数値エラー!");
write_log("etc: phpvisor.php /usr/local/nginx/bin/nginx nothing xxx");
write_log("最初のパラメータはこのファイル、2 番目のパラメータは監視対象の実行可能ファイルのパス、3 番目のパラメータは実行に使用するユーザー、次のパラメータは実行可能ファイルの実行に使用されるパラメータ") ;
exit();
}
//$args[0] はこのファイルの名前です
$path=$args[1];
$username=$args[2];
for($i=3;$i>0;$i--)
array_shift($args);

その間(1){
$pid=pcntl_fork();
if($pid==0)
{
//write_log("子 ".getmypid()." 実行");
pcntl_exec($path,$args,$_SERVER);
write_log("ファイルの実行に失敗しました");
終了(0);
}
else if($pid>0)
{
//write_log(" main pid:".getmypid().", child_pid:".$pid);
$endpid=pcntl_waitpid($pid,$status,2); //write_log("ステータス:".$ステータス); if($status==0)
{
//それは、バックグラウンドで実行されているデーモン プログラムである可能性があることを意味します
if(file_exists("/proc/".($pid+1)."/stat"))
{
//プロセスが存在し、定期的に判断する必要があることを示します
write_log("プログラム開始成功");

のために(;;)
{
If(file_exists("/proc/".($pid+1)."/stat"))
{
//write_log("プログラムは生きています");
usleep(1000000);
}
その他
{
write_log("プログラムダイ");
休憩;
}
}

}
それ以外
{
//プロセスが存在せず、非デーモン状態ではないことを示します。
write_log("プログラムの開始に失敗しました");
終了(0);
}
}
else if($status>0)
{
// 非デーモン プログラムであるかどうかを説明します。終了したため再起動する必要があります
Write_log("プログラムダイ");
//続き;
}
それ以外
{
終了(0);
}

if(chk_need_start($_times_arr,$_retry_times_duration,$_retry_times))

{

続けてください;
}
それ以外
{
休憩
}
}
};

関数 write_log($msg)

{
print(date('Y-m-d H:i:s').' '.$msg."n");
}

関数 chk_need_start(&$_times_arr,$_retry_times_duration,$_retry_times)

{

foreach($_times_arr as $k=>$v)
{
//write_log("期間:".$_retry_times_duration);
if($k {
//write_log("設定を解除する");
設定を解除($_times_arr[$k]);
}
}
//write_log("バッファ数:".count($_times_arr));
if(count($_times_arr)>=$_retry_times)
{

false を返す;

}

それ以外
{
$_times_arr[time()]=1;

true を返します;
}
}
?>


http://www.bkjia.com/PHPjc/477518.html

tru​​ehttp://www.bkjia.com/PHPjc/477518.html技術記事 php コマンド ライン ツールがインストールされている限り、次の例を実行できます: phpvisor.php /usr/local/nginx/bin/nginxEveryone (この後に対応するコマンドのパラメーターを追加することもできます。空白のままにすることもできます)パラメータがない場合)...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート