ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるデーモンプロセスの一般的な実装方法を詳しく解説

PHPにおけるデーモンプロセスの一般的な実装方法を詳しく解説

巴扎黑
巴扎黑オリジナル
2017-09-09 15:02:551571ブラウズ

この記事では、PHP デーモン プロセスの 2 つの一般的な実装方法を主に紹介し、PHP デーモン プロセスの原理、関連する実装方法、および運用上の注意事項を具体的な例の形式で分析します。 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]#

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

[root@localhost php]# fg
php deadloop.php
1470996682
1470996685
1470996688
1470996691

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

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

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

SIGHUP は、次の 3 つの状況で対応するプロセスに送信されます:

1. ターミナルが閉じられると、シグナルがセッションに送信されます。最初のプロセスとジョブとして送信されたプロセス (つまり、& 記号で送信されたプロセス)

2. セッションの最初のプロセスが終了すると、セッション内のフォアグラウンド プロセス グループ内の各プロセスにシグナルが送信されます

3親プロセスが存在すると、プロセス構成が孤立したプロセスグループとなり、プロセスグループ内のプロセスが停止した場合(SIGSTOPまたはSIGTSTPシグナルを受信した場合)、このシグナルがプロセスグループ内のすべてのプロセスに送信されます。

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

SIGHUP シグナルのシステムのデフォルトの処理は、シグナルを受信するプロセスを終了することです。したがって、プログラムでシグナルがキャプチャされていない場合、シグナルを受信した時点でプロセスは終了します。

つまり、ターミナルプロセスを閉じると SIGHUP シグナルが受信され、このシグナルのデフォルトの処理方法は、プロセスを終了することです。もちろん、シグナルを自分で処理することも、無視することもできます。上記のループの例に少し改良を加えてみましょう

<?php
declare(ticks = 1);
pcntl_signal(SIGHUP, function(){
    // 这地方处理信号的方式我们只是简单的写入一句日志到文件中
    file_put_contents(&#39;logs.txt&#39;, &#39;pid : &#39; . posix_getpid() . &#39; receive SIGHUP 信号&#39; . PHP_EOL);
});
while(true){
    echo time().PHP_EOL;
    sleep(3);
}

Linux が提供する nohup コマンドを使用するだけで済みます。ターミナルに接続すると、プロセスは SIGHUP シグナルを無視し、終了しません。まず、今のシグナル処理コードを削除します。次に nohup を実行します。

[root@localhost php]# nohup php deadloop.php

nohup: 入力を無視し、出力を「nohup.out」に追加します

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

[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

を入力します。この時点ではプロセスは終了しませんが、プロセスを作成した親プロセスが終了したため、孤立プロセス (ppid=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 ~]#

結論:

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

[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]#

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

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

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

りー

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。