>  기사  >  백엔드 개발  >  PHP는 데몬 프로세스를 구현합니다.

PHP는 데몬 프로세스를 구현합니다.

藏色散人
藏色散人앞으로
2019-08-09 14:13:285427검색

PHP는 데몬 프로세스를 구현합니다.

데몬 프로세스

상주 프로세스 서비스로서 PHP-FPM, NGINX, REDIS와 같이 전체 서비스를 지원하려면 상위 프로세스가 필요한 매우 일반적입니다. 그러나 PHP로 데몬 프로세스를 작성하는 경우는 거의 없습니다. 오늘은 PHP를 사용하여 구현해 보겠습니다.

단계

● 하위 프로세스 포크

● 상위 프로세스 종료

● 새 세션 설정

● 파일 마스크 재설정

● 표준 입력 및 출력 닫기

구현

우리는 직면하고 있습니다. 위의 내용을 달성하려면 pcntl 및 posix 확장이 필요합니다. 해당 확장이 설치되어 있는지 확인하십시오.

function daemon() {
    $pid = pcntl_fork();
    // fork 失败
    if ($pid < 0) {
        exit(&#39;fork failed&#39;);
    } else if ($pid > 0) {
       // 退出父进程
        exit(0);
    }
    // 设置新的会员
    // setsid 有几个注意点
    // 不能是进程组的组长调用
    // 对于进程组组员调用会产生新的会话和进程组,并成为该进程组的唯一成员,调用的进程将脱离终端
    if (posix_setsid() < 0) {
        exit(&#39;set sid failed&#39;);
    }
    // 重置文件掩码
    umask(0);
    // 切换工作目录
    chdir(&#39;/&#39;);
    // 关闭标准输入输出
    fclose(STDIN);
    fclose(STDOUT);
    fclose(STDERR);
}

Details

// 获取进程ID
var_dump(posix_getpid());
// 获取进程组ID
var_dump(posix_getpgid(posix_getpid()));
// 获取进程会话ID    
var_dump(posix_getsid(posix_getpid()));

세 가지 결과는 동일하며 이는 프로세스가 프로세스 그룹의 리더이더라도 세션 리더이기도 함을 나타냅니다.

umask(0)가 필요한 이유

Linux에서 umask를 호출하면 마스크 값이 표시됩니다. 이 마스크는 생성하는 파일의 권한 범위를 결정합니다. 예를 들어 현재 컴퓨터의 umask는 다음과 같습니다.

0022

파일의 최대 권한은 0666, 디렉터리의 최대 권한은 0777입니다. 그러면 현재 사용자가 생성한 디렉터리 권한은 0755로, 현재 사용자에 대한 rwx-rx-rx 권한입니다. . 파일은 0644이며 현재 사용자에 대한 rw-r-r 권한이 있습니다. 따라서 재설정 마스크가 없으면 디렉터리의 경우 0755, 파일의 경우 0644가 됩니다.

Note

프로세스에서 echo var_dump와 같은 기능을 사용하는 경우 표준 출력을 다른 파일 스트림으로 리디렉션해야 합니다. 다음 코드를 추가하면 됩니다.

global $stdin, $stdout, $stderr;
$stdin = fopen(&#39;/dev/null&#39;, &#39;r&#39;);
$stdout = fopen(&#39;/www/php/txt.txt&#39;,&#39;wb&#39;);
$stderr = fopen(&#39;/dev/null&#39;, &#39;wb&#39;);

위에서 표준 입력 및 출력이 닫혔기 때문에 파일 설명자 fd를 다시 열면 더 이상 사용할 수 없습니다. fd는 음수가 아닌 것부터 시작하여 0, 1, 2입니다. 표준 입력 및 출력 역할을 하는 파일입니다. 물론 리디렉션을 직접 설정해야 합니다.

마지막 2차 포크

이 문제는 꼭 필요한 문제가 아니기 때문에 신중하게 고려해야 합니다. 현재로서는 Fork가 두 번 필요한 시나리오는 생각할 수 없습니다.

위 내용은 PHP는 데몬 프로세스를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제