この記事では主に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 を見てみましょう
[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('logs.txt', 'pid : ' . posix_getpid() . ' receive SIGHUP 信号' . PHP_EOL); }); while(1) { sleep(10); pcntl_signal_dispatch(); }
[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 は標準エラー出力をリダイレクトします。
上記は最初の実装方法の紹介です。
[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でプロセスをデーモン化する2つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。