>  기사  >  백엔드 개발  >  PHP 프로세스 통신을 기반으로 한 신호에 대한 자세한 설명

PHP 프로세스 통신을 기반으로 한 신호에 대한 자세한 설명

墨辰丷
墨辰丷원래의
2018-05-25 11:32:341245검색

이 글은 PHP 프로세스 통신의 기본 중 신호에 대한 기본 지식과 예제를 주로 소개합니다. 도움이 필요한 친구들은

신호 통신 사용을 참고할 수 있습니다. kill -l을 사용하여 현재 시스템의 신호 유형을 볼 수 있습니다.
각 시그널의 자세한 의미는 제 글을 확인해주세요: http://www.jb51.net/article/106040.htm
시그널을 사용할 때, php --version Version을 통해 현재 PHP를 확인할 수 있습니다. 프로세스 간 신호 통신에 어떤 방법을 사용할지 결정되었습니다.

[root@roverliang ipc]# php --version

PHP 5.6.24 (cli) (built: Aug 15 2016 19:14:02)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

pcntl_signal_dispatch 기능을 사용하려면 PHP 버전(PHP 5 >= 5.3.0, PHP 7)이 필요합니다.

PHP 버전이 5.3 미만인 경우 일부 대기업에서는 이 버전보다 낮을 수 있습니다. 이때 선언(ticks=1)이 사용됩니다. 즉, 하위 수준 명령어가 실행될 때마다
가 신호 발생 여부를 감지한다는 의미입니다. 자세한 소개는 http://www.jb51.net/article/48340.htm

을 확인하세요. 공식 홈페이지에서는 다음과 같이 설명하고 있습니다. Tick(시계 주기)은 인터프리터가 N개의 하위 수준 명령문을 실행할 때마다 타이머입니다. 발생하는 선언 코드 세그먼트 이벤트에서 시간을 정할 수 있습니다. N 값은 선언의 지시문 부분에서 Ticks=N으로 지정됩니다.

저수준 명령문이란 무엇입니까? 다음 코드에 표시된 대로:

  for ($i = 0; $i < 3; $i++) {
    echo $i.PHP_EOL;
  }

이 for 루프에는 세 가지 저수준 명령어가 포함되어 있습니다. $i가 출력될 때마다. 등록된 이벤트가 발생했는지 여부를 감지합니다. 짐작할 수 있듯이 이 효율성은 상대적으로 낮습니다. 따라서 귀하의 PHP가 5.3 이상인 것으로 감지되면. 신호 전달을 위해 pcntl_singal_dispath를 사용하십시오.

메인 프로세스는 시작될 때 일부 신호 처리 기능을 등록합니다.

/**
 * @param $signal 信号
 */
function signalHandal($signal)
{
  switch ($signal) {
    case SIGINT:
      //do something
      break;
    case SIGHUP:
      //do something
      break;
    default :
      //do something
      break;
  }
}

그런 다음 신호 프로세서를 신호 처리 함수에 바인딩합니다.

//根据不同的信号,安装不同的信号处理器
pcntl_signal(SIGINT, &#39;signalHandal&#39;);
pcntl_signal(SIGHUP, &#39;signalHandal&#39;);
pcntl_signal(SIGUSR1, &#39;signalHandla&#39;);

자식 프로세스의 신호를 듣고 신호가 발생하면 사전 설치된 신호 처리 함수를 호출합니다.

//分配信号。
pcntl_signal_dispatch($signal);

아이디어 정리하기:
1. 신호가 발생할 때 이벤트를 처리해야 하는 함수를 정의합니다.
2. 신호 설치라고 하는 신호 처리 기능을 바인딩합니다.
3. 신호 모니터링 또는 분배, 신호가 나타나면 설치된 신호를 호출합니다.

위의 신호 개념을 이해하고 데모를 살펴보겠습니다.

<?php
$parentpid = posix_getpid();
echo "parent progress pid:{$parentpid}\n";

//定义一个信号处理函数

function sighandler($signal) {
  if ($signal == SIGINT) {
    $pid = getmypid();
    exit("{$pid} process, Killed!".PHP_EOL);
  }
}

//php version < 5.3 .每执行一条低级指令,就检查一次是否出现该信号。效率损耗很大。
//declare(ticks=1);
$child_list = [];
//注册一个信号处理器。当发出该信号的时候对调用已定义的函数
pcntl_signal(SIGINT, &#39;sighandler&#39;);



for($i = 0; $i < 3; $i++) {
  $pid = pcntl_fork();
  if ($pid == 0) {
    //子进程
    while (true) {
      //调用已安装的信号信号处理器,为了检测是否有新的信号等待dispatching
      pcntl_signal_dispatch();
      echo "I am child: ".getmypid(). " and i am running !".PHP_EOL;
      sleep(rand(1,3));
    }
  } elseif($pid > 0) {
    $child_list[] = $pid;
  } else {
    die(&#39;fork fail!&#39;.PHP_EOL);
  }
}

sleep(5);
foreach ($child_list as $key => $pid) {
  posix_kill($pid, SIGINT);
}

sleep(2);
echo "{$parentpid} parent is end".PHP_EOL;


위는 이 기사의 전체 내용입니다. 모든 사람의 학습에 도움이 되기를 바랍니다.


관련 권장 사항:

PHP 공유 메모리 사용량 및 signal제어 예제 분석

matplotlib Python을 기반으로 한 시간 도메인 파형 및 정현파 signal의 스펙트로그램 예제 구현

PHP 프로세스 신호 처리 중

위 내용은 PHP 프로세스 통신을 기반으로 한 신호에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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