ホームページ > バックエンド開発 > PHPチュートリアル > PHPでプロセスをデーモン化する2つの方法

PHPでプロセスをデーモン化する2つの方法

墨辰丷
リリース: 2023-03-25 19:22:01
オリジナル
1698 人が閲覧しました

この記事では主にphpの2つのデーモンメソッドを紹介します。興味のある方はぜひ参考にしてください。

最初の方法は、nohup と & を一緒に使用することです。

開始されたプロセスがコンソールを占有せずにバックグラウンドで実行できるようにするには、コマンドの後にアンパサンドを追加します。ここでは、while 無限ループを使用して説明します。 & メソッドを使用してプロセスを開始します

<?php

while(true){
        echo time().PHP_EOL;
        sleep(3);
}
ログイン後にコピー


プロセスがコンソールを占有していないことがわかります。このとき、コンソールは他のコマンドを実行することもできます。プロセスを通常モードに戻すこともできます。コンソールを占領する。



[root@localhost php]# php deadloop.php &
[1] 3454
[root@localhost php]# ps aux | grep 3454
root      
3454  0.0  0.8 284544  8452 pts/0    
T    18:06   0:00 php deadloop.php
root      
3456  0.0  0.0 103316   896 pts/0    
S+   18:08   0:00 grep 3454

[1]+  Stopped                 
php deadloop.php
[root@localhost php]#
ログイン後にコピー


上記は & コマンドの簡単な紹介です


別のコマンド nohup を見てみましょう

コマンドの前に nohup を追加すると、開始されたプロセスは Linux ハング信号を無視します ( SIGHUP )、Linux で SIGHUP シグナルはどのような状況でトリガーされますか? 次の内容は Baidu 百科事典からの抜粋です:

[root@localhost php]# fg
php deadloop.php
1470996682
1470996685
1470996688
1470996691
ログイン後にコピー


1 と 2 を組み合わせると、プロセスが & (ジョブ モードで開始されたかどうかに関係なく) であることがわかります。 )、ターミナルが閉じられると SIGHUP シグナルが受信されます。それでは、プロセスは SIGHUP シグナルを受信すると何をしますか? 百度百科事典から引用した文も参照してください

SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进
程)
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或
SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
ログイン後にコピー

つまり、ターミナル プロセスを閉じると SIGHUP シグナルが受信されます。もちろん、シグナルを自分でキャプチャして処理することも、シグナルを無視することもできます。たとえば、次のコード

系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该
信号时,进程就会退出。
ログイン後にコピー

では、このルーチンを実行します。コマンドラインを実行し、シェルターミナルウィンドウを直接閉じて、ターミナルを再度開いてプロセスを表示します。 まだ実行中ですか:

<?php
pcntl_signal(SIGHUP, function(){
   //这地方处理信号的方式我们只是简单的写入一句日志到文件中
   file_put_contents(&#39;logs.txt&#39;, &#39;pid : &#39; . posix_getpid() . &#39; 
   receive SIGHUP 信号&#39; . PHP_EOL);
});
        
while(1) {
        sleep(10);
        pcntl_signal_dispatch();
}
ログイン後にコピー

Deadloop.php がまだ実行中であり、その親プロセスが init プロセスになっていることがわかります (なぜなら、元の親プロセスが終了し、init プロセスによって採用された)、書き込まれたファイルの内容も確認できます。終了ターミナル プロセスが SIGHUP シグナルを受信したことを確認してください。実際には、Linux が提供する nohup コマンドを使用するだけで済みます。ただし、nohup を使用してプロセスを開始すると、プロセスは受信した SIGHUP シグナルを無視して終了しません。 , 先ほどの信号処理コードを削除します。次に、nohup を実行します。

[root@localhost php]# ps -ef | grep deadloop.php 
root     16112     1  0 17:20 ?        00:00:00 php deadloop.php
root     16138 16115  0 17:24 pts/4    00:00:00 grep deadloop.php
[root@localhost php]# cat logs.txt 
pid : 16112 receive SIGHUP 信号
ログイン後にコピー


そして、nohup はデフォルトでプログラムの出力を現在のディレクトリの nohup.out ファイルにリダイレクトします。書き込み権限がない場合は、$homepath/nohup.out

[root@localhost php]# nohup php deadloop.php 
nohup: 忽略输入并把输出追加到"nohup.out"
ログイン後にコピー
と書き込みます。


この時点でターミナルを閉じると、プロセスは終了せず、そのプロセスを作成した親プロセスが終了しているため、孤立プロセス (ppid=1) になります。





[root@localhost php]# ls
cmd.sh  deadloop.php  getPhoto.php  nohup.out  pics
[root@localhost php]# tail -f nohup.out 
1470999772
1470999775
1470999778
1470999781
1470999784
1470999787
1470999790
1470999793
1470999796
1470999799
1470999802
ログイン後にコピー



結論: nohup メソッドと & メソッドを組み合わせると、開始されたプロセスはコンソールを占有せず、コンソールが閉じられた後はコンソールに依存しません。 , プロセスはプロセス No. 1 によって採用され、孤立プロセスになります。これはデーモン プロセスのメカニズムと非常によく似ています。

[root@localhost ~]# ps -ef | grep 3554
root      3554  3497  0 19:09 pts/0    00:00:00 php deadloop.php
root      3575  3557  0 19:10 pts/1    00:00:00 grep 3554
[root@localhost ~]# ps -ef | grep 3554
root      3554     1  0 19:09 ?     00:00:00 php deadloop.php
root      3577  3557  0 19:10 pts/1    00:00:00 grep 3554
[root@localhost ~]#
ログイン後にコピー


ここで、>logs.txt は標準出力をリダイレクトし、2>error.txt は標準エラー出力をリダイレクトします。


上記は最初の実装方法の紹介です。

2つ目の実装方法は、デーモンプロセスのルールや特性に合わせてコードで実装する方法です。デーモンプロセスの最大の特徴は、ユーザーの端末やセッションから分離されている点です。要所要所にコメント。

[root@localhost php]# nohup php deadloop.php >logs.txt 2>error.txt &
[1] 3612
[root@localhost php]# ps -ef |grep 3612
root      3612  3557  0 19:18 pts/1    00:00:00 php deadloop.php
root      3617  3557  0 19:19 pts/1    00:00:00 grep 3612
[root@localhost php]#
ログイン後にコピー

関連する推奨事項:


PHPプロセス信号処理

PHPプロセス間通信の詳細説明


PHPプロセスロックの実装方法

以上がPHPでプロセスをデーモン化する2つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート