>  기사  >  백엔드 개발  >  PHP에서 데몬 프로세스의 두 가지 방법

PHP에서 데몬 프로세스의 두 가지 방법

墨辰丷
墨辰丷원래의
2018-05-15 17:45:531671검색

이 글은 주로 PHP의 두 가지 데몬 메소드를 소개합니다. 관심 있는 친구들이 참고하면 도움이 될 것입니다.

첫 번째 방법은 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]#


프로세스가 콘솔을 점유하지 않는 것을 볼 수 있습니다. 콘솔은 또한 다른 명령을 실행할 수도 있습니다. 이때 fg 명령을 사용하여 프로세스를 일반 모드로 복원할 수도 있습니다. 콘솔을 점령하는 것입니다.



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


위는 & 명령에 대한 간략한 소개입니다


또 다른 명령 nohup을 살펴보겠습니다

명령 앞에 nohup을 추가하면 시작된 프로세스는 Linux 정지 신호( SIGHUP ), Linux에서 SIGHUP 신호는 어떤 상황에서 트리거됩니까? 다음 내용은 Baidu Encyclopedia에서 가져온 것입니다:


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


1과 2를 결합하면 프로세스가 &(작업 모드로 시작되는지 여부에 관계없이) ), 터미널이 닫히면 SIGHUP 신호를 받게 되는데, SIGHUP 신호를 받으면 프로세스는 어떻게 될까요? Baidu Encyclopedia

系统对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과 & 메소드를 결합하면 시작된 프로세스는 콘솔을 차지하지 않으며 콘솔이 닫힌 후에는 콘솔에 의존하지 않습니다. , 프로세스는 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 프로세스 잠금 구현 방법

위 내용은 PHP에서 데몬 프로세스의 두 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:php权限管理다음 기사:php中字符串相关函数