Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung von Signalen anhand der PHP-Prozesskommunikation

Detaillierte Erklärung von Signalen anhand der PHP-Prozesskommunikation

墨辰丷
墨辰丷Original
2018-05-25 11:32:341294Durchsuche

Dieser Artikel stellt hauptsächlich die Grundkenntnisse und Beispiele im Zusammenhang mit Signalen in den Grundlagen der PHP-Prozesskommunikation vor. Freunde in Not können sich auf

Verwenden von Signalkommunikation beziehen. Sie können kill -l verwenden, um den Signaltyp des aktuellen Systems anzuzeigen.
Die detaillierte Bedeutung jedes Signals finden Sie in meinem Artikel: http://www.jb51.net/article/106040.htm
Bei der Verwendung von Signalen können Sie php --version verwenden. Überprüfen Sie die aktuelle PHP-Version . Es wurde entschieden, welche Methode für die Signalkommunikation zwischen Prozessen verwendet werden soll.

[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

Die Verwendung der Funktion pcntl_signal_dispatch erfordert eine PHP-Version (PHP 5 >= 5.3.0, PHP 7)

Wenn PHP-Version Weniger als 5,3. Einige große Unternehmen können unter dieser Version liegen. Zu diesem Zeitpunkt wird „declare(ticks=1)“ verwendet, was bedeutet, dass
jedes Mal, wenn eine Low-Level-Anweisung ausgeführt wird, erkennt, ob das Signal auftritt. Eine ausführliche Einführung finden Sie unter http://www.jb51.net/article/48340.htm

Die offizielle Website erklärt wie folgt: Tick (Taktzyklus) ist ein Timer, der alle N Elemente zeitlich gesteuert werden kann Vom Interpreter im Deklarationscodesegment ausgeführte Ereignisse, die bei Low-Level-Anweisungen auftreten. Der Wert von N wird mit ticks=N im Direktiventeil der Deklaration angegeben.

Was sind also Low-Level-Anweisungen: Wie im folgenden Code gezeigt:

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

Dann enthält diese for-Schleife drei Low-Level-Anweisungen . Jedes Mal, wenn $i ausgegeben wird. Es erkennt, ob ein registriertes Ereignis aufgetreten ist. Wie Sie sich vorstellen können, ist diese Effizienz relativ gering. Wenn also festgestellt wird, dass Ihr PHP größer oder gleich 5.3 ist. Verwenden Sie einfach pcntl_singal_dispath für den Signalversand.

Der Hauptprozess registriert beim Start einige Signalverarbeitungsfunktionen.

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

Dann binden Sie den Signalprozessor an die Signalverarbeitungsfunktion:

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

Hören Sie zu für Signale im untergeordneten Prozess. Rufen Sie die vorinstallierte Signalverarbeitungsfunktion auf

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

Lassen Sie uns die Ideen klären:
1. Definition Die Funktion, die das Ereignis verarbeiten muss, wenn das Signal auftritt
2. Binden Sie das Signal und die Signalverarbeitungsfunktion, die als Signalinstallation bezeichnet wird.
3. Signalüberwachung oder -verteilung: Wenn ein Signal erscheint, rufen Sie das installierte Signal an.

Nachdem wir das obige Signalkonzept verstanden haben, werfen wir einen Blick auf eine Demo:

<?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;


Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.


Verwandte Empfehlungen:

PHP-Shared-Memory-Nutzung und SignalKontrollinstanzanalyse

Beispiele für Zeitbereichswellenformen und Spektrogramme von SinussignalenSignal basierend auf Matplotlib Python

PHP-ProzessSignalVerarbeitung

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Signalen anhand der PHP-Prozesskommunikation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn