Heim  >  Artikel  >  Backend-Entwicklung  >  PHP verwendet pcntl und libevent, um die Timer-Funktion zu implementieren

PHP verwendet pcntl und libevent, um die Timer-Funktion zu implementieren

高洛峰
高洛峰Original
2016-12-22 16:13:081182Durchsuche

PHP verwendet pcntl und libevent, um die Timer-Funktion zu implementieren. Schauen wir uns zunächst das Beispiel pcntl (PHP-Thread) an, das unten erläutert wird.

<?php  

function newChild($func_name) {  
    echo "enter newChild\n";  
    $args = func_get_args();  
    unset($args[0]);  
    $pid =  pcntl_fork();  
    if ($pid == 0) {  
        function_exists($func_name) and exit(call_user_func_array($func_name, $args)) or exit(-1);  
    } else if($pid == -1) {  
        echo "Couldn&#39;t create child process";  
    } else {  
        return $pid;  
    }  
}  

(PS:^_^不错的php开发交流群:256271784,验证:csl,有兴趣的话可以加入进来一起讨论)
function on_timer() {  
    echo "timer called\n";  
}  

   
/** 
 * @param $func string, function name 
 * @param $timeouts int, microtimes for time delay 
 */ 
function timer($func, $timeouts){  

   
    echo "enter timer\n";  
    $base = event_base_new();  
    $event = event_new();  

   
    event_set($event, 0, EV_TIMEOUT, $func);  
    event_base_set($event, $base);  
    event_add($event, $timeouts);  

   
    event_base_loop($base);  
}  

   
$pid = newChild("timer", "on_timer", 5000000);  

   
if ($pid > 0) {  
    echo "master process exit\n";  
}

PHP erweitert pcntl um „Multi-Threading“ (Prozess) zu implementieren
pcntl und Ticks
Ticks werden durch die Syntax „declare(ticks = n) {statement}“ definiert ticks. Die von ihm definierte Bedeutung von ticks = n besteht darin, dass ein Ereignis über register_tick_function($function_name) registriert werden kann, wenn N Low-Level-Anweisungen im durch „declare“ angegebenen Anweisungsblock ausgeführt werden von pcntl basiert auf dem Ticks-Mechanismus. Wenn wir daher signalbezogene Funktionen in der pcntl-Funktionsfamilie verwenden, müssen wir die Syntaxstruktur „declare(ticks = n)“ voranstellen.
int pcntl_alarm(int $ Sekunden):
$Sekunden Sekunden Rückwärtsprozess Senden Sie ein SIGALRM-Signal, und jeder Aufruf der Methode pcntl_alarm bricht die zuvor eingestellte Uhr ab.
void pcntl_exec(string $path[, array $args[, array $env] ]):
Führen Sie ein Programm im aktuellen Prozessraum aus.
$path: Muss eine binäre ausführbare Datei oder ein Skriptdateipfad mit gültigen Skript-Header-Informationen sein (#!/usr/local/bin/php) .
$args: Zeichen, die an die String-Parameterliste des Programms übergeben werden sollen (Array-Form)
$envs: Umgebungsvariable, die in Form eines Arrays an die Umgebungsvariable des auszuführenden Programms übergeben werden soll (Schlüssel =>). Wertform).
int pcntl_for k (void):
Erstellen Sie einen untergeordneten Prozess, der sich vom übergeordneten Prozess nur in PID (Prozessnummer) und PPID (übergeordnete Prozessnummer) unterscheidet.
Gibt den erstellten Prozess zurück Untergeordneter Prozess-PID, wenn der übergeordnete Thread ausgeführt wird, und 0 zurückgegeben wird, wenn der untergeordnete Thread ausgeführt wird. Wenn der untergeordnete Prozess fehlschlägt, wird -1 im Kontext des übergeordneten Prozesses zurückgegeben und ein PHP-Fehler ausgelöst Sie müssen wissen: pcntl_fork erstellt einen Verzweigungsknoten, der einer Markierung entspricht. Nachdem der übergeordnete Prozess abgeschlossen ist, wird der untergeordnete Prozess an der Markierung fortgesetzt, was bedeutet, dass der Code nach pcntl_fork zweimal ausgeführt wird Der übergeordnete Prozess und der untergeordnete Prozess sind unterschiedlich und die von den beiden Prozessen während der Ausführung erhaltenen Rückgabewerte können getrennt werden, um unterschiedliche Codes auszuführen.
int pcntl_getpriority([int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]):
Erhalten Sie die Priorität des Prozesses, der der angegebenen $pid entspricht. Der Standardwert wird durch getmypid() ermittelt. Der Wert ist der aktuelle Prozess pid: Wenn nicht angegeben, ist der Standardwert der aktuelle Prozess.
$process_identifier: Einer von PRIO_PGRP, PRIO_USER, PRIO_PROCESS. Unter diesen bezieht sich PRIO_PGRP auf die Priorität der Prozessgruppe, PRIO_USER bezieht sich auf das Abrufen Priorität des Benutzerprozesses, PRIO_PROCESS bezieht sich auf das Abrufen der Priorität eines bestimmten Prozesses.
Gibt die Priorität des Prozesses zurück oder gibt false zurück, wenn ein Fehler auftritt. Je kleiner der Wert, desto höher die Priorität
bool pcntl_setpriority( int $priority[ , int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]:
Legen Sie die Priorität des Prozesses fest.
$priority: Prioritätswert im Bereich von -20 bis 20, Die Standardpriorität ist 0. Je kleiner der Wert, desto höher die Priorität. Wenn nicht angegeben, bezieht sie sich auf den aktuellen Prozess 🎜> Gibt TRUE zurück, wenn die Einstellung erfolgreich ist, und FALSE, wenn sie fehlschlägt.
bool pcntl_signal_dispatch(void):
Rufen Sie den Handler des bevorstehenden Signals auf, das über pcntl_signal() installiert wird.
Der Aufruf gibt TRUE zurück, wenn er erfolgreich ist , false, wenn fehlgeschlagen.
php 5.3.3 Hinzugefügt
bool pcntl_signal(int $signo, callback $handler[, bool $restart_syscalls = true]):
Installieren Sie einen neuen Signalhandler $handler für das angegebene Signal $signo.
Der letzte Parameter hat keine Bedeutung.
bool pcntl_sigprocmask (int $how, array $set[, array &$oldset]):
Das Sperrsignal hinzufügen, löschen oder festlegen, das spezifische Verhalten hängt vom $how-Parameter ab
$how: SIG_BLOCK wird verwendet, um das Signal zum aktuellen hinzuzufügen. Unter den Sperrsignalen wird SIG_UNBLOCK verwendet, um das Signal vom aktuellen Sperrsignal zu entfernen, und SIG_SETMASK wird verwendet, um das aktuelle Sperrsignal durch zu ersetzen eine bestimmte Signalliste.
$set: Eine Liste von Signalen, die hinzugefügt, entfernt oder eingestellt werden sollen.
$oldset: wird verwendet, um das alte Sperrsignal an den Anrufer zurückzugeben.
Gibt TRUE bei Erfolg zurück, FALSE bei Fehler.
int pcntl_sigtimedwait(array $set[, array &$siginfo[, int $seconds = 0[, int $nanoseconds = 0]]]):
pcntl_sigtimedwait macht tatsächlich das Gleiche wie pcntl_sigwaitinfo(), aber pcntl_sigtimedwait hat zwei weitere erweiterte Parameter $seconds und $nanoseconds, die es dem Skript ermöglichen, länger zu bleiben. Es gibt eine Obergrenze statt unbegrenztem Warten
$set: Liste der Signale, auf die gewartet werden muss
$siginfo : Wird verwendet, um dem Anrufer Informationen über die zu wartenden Signale zurückzugeben. Informationen zum Inhalt finden Sie unter pcntl_sigwaitinfo
$seconds: Timeout Die Anzahl der Sekunden
$nanoseconds: Die Anzahl der Nanosekunden für das Timeout
Nach Erfolg , pcntl_sigtimedwiat() gibt die Signalnummer zurück
int pcntl_sigwaitinfo(array $set[, array &$siginfo]):
Pending current Das Skript wird ausgeführt, bis ein Signal in $set empfangen wird kurz vor dem Eintreffen (z. B. Sperrung durch pcntl_sigprocmask), dann gibt pcntl_sigwaitinfo sofort zurück
$set: Wartesignalliste
$siginfo: Wird verwendet, um dem Anrufer die Informationen über das darauf wartende Signal zurückzugeben den folgenden Inhalt:
1. Alle Signale haben die folgenden drei Informationen:
a) signo: Signalnummer
b) errno: Fehler-Nr.
c) Code: Signalcode
2. SIGCHLD signalspezifische Informationen
a) Status: Ausgangswert oder Signal
b) utime: Benutzerverbrauchszeit
c) stime: Systemverbrauchszeit
d) pid: Sendeprozess-ID
e) uid: echte Benutzer-ID des sendenden Prozesses
3. Informationen im Besitz von SIGILL, SIGFPE, SIGSEGV, SIGBUS
a) addr: Speicherort, an dem der Fehler aufgetreten ist
4. Eindeutige SIGPOLL-Informationen:
a) band: Bandereignis, Bedeutung unbekannt
b) fd: Dateideskriptor
Die Funktion wird erfolgreich ausgeführt und gibt die Signalnummer zurück
int pcntl_wait(int &$status [ , int *options = 0]):
Hängt den aktuellen Prozess an, bis ein untergeordneter Prozess beendet wird oder bis ein Signal die Beendigung des aktuellen Prozesses erfordert oder eine Signalverarbeitungsfunktion aufgerufen wird, wenn der untergeordnete Prozess beim Aufruf bereits beendet wurde (allgemein als Zombie-Prozess bekannt), kehrt diese Funktion sofort zurück und alle Systemressourcen werden freigegeben.
$status wird zum Speichern der Statusinformationen des untergeordneten Prozesses verwendet, die von den folgenden Funktionen generiert werden: pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig .
$options: Wenn Ihr System wait3 zulässt (die meisten BSD-ähnlichen Systeme), können Sie einen optionalen Optionsparameter angeben. Wenn dieser Parameter nicht bereitgestellt wird, verwendet wait den Systemaufruf Wenn das System wait3 nicht zulässt, kann der Wert von $options 0 oder die beiden Konstanten WNOHANG und WUNTRACED sein.
Die Funktion gibt die PID des beendenden untergeordneten Prozesses zurück, oder -1 Fehler, oder wenn WNOHANG als Option bereitgestellt wird (wait3 nicht verfügbares System) und kein gültiger untergeordneter Prozess vorhanden ist, wird 0 zurückgegeben Um einige Informationen dem übergeordneten Prozess zu überlassen, verlässt der untergeordnete Prozess die nächste Datenstruktur, die als Zombie bezeichnet wird, und wartet auf einen vom übergeordneten Prozess initiierten Wartevorgang, um seine Leiche einzusammeln. Der untergeordnete Prozess wird in der Zeit dazwischen als Zombie-Prozess bezeichnet das Ende des untergeordneten Prozesses (logisches Ende) und die Sammlung seiner Leiche durch den übergeordneten Prozess. Nach dem Ende werden alle untergeordneten Prozesse an Init übergeben. Daher werden die Zombie-Prozesse recycelt. Wenn der übergeordnete Prozess jedoch nie endet, belegen diese Zombie-Prozesse immer die Prozessnummer. Wenn sie erschöpft ist, kann kein neuer Prozess gestartet werden um die Leichen der untergeordneten Prozesse zu sammeln, die von ihm selbst im übergeordneten Prozess generiert wurden.
int pcntl_waitpid(int $pid, int &$status[, int $options = 0 ]):
Hängt den aktuellen Prozess bis zum untergeordneten Prozess an Prozess mit der angegebenen $pid wird beendet, oder der aktuelle Prozess empfängt ein Exit-Signal oder empfängt ein IGE-Signal, um einen Signalhandler aufzurufen.
Wenn $pid angegeben ist, wurde der entsprechende untergeordnete Prozess beim Aufruf dieser Funktion beendet (Zombie-Status). , die Funktion kehrt sofort zurück und alle Systemressourcen werden freigegeben
$pid: Prozessnummer, kleiner als -1 zeigt an, dass auf einen untergeordneten Prozess in der Prozessgruppe gewartet wird. Die Prozessgruppennummer ist der absolute Wert von $ pid. Gleich -1 bedeutet, dass auf eine verbotene Stadt gewartet wird, was mit dem Verhalten der Funktion pcntl_wait übereinstimmt. Gleich 0 bedeutet, dass auf einen untergeordneten Prozess in derselben Gruppe wie der aufrufende Prozess gewartet wird, und größer als 0 bedeutet, dass es sich um einen bestimmten Prozess handelt .
$status: wird verwendet, um den untergeordneten Prozessstatus von der Funktion zurückzugeben. Diese Statusinformationen werden von den folgenden Funktionen generiert: pcntl_wifexited, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig.
$options: hat die gleiche Bedeutung als $options von pcntl_wait
int pcntl_wexitstat us (int $status):
Gibt den Rückkehrcode eines unterbrochenen untergeordneten Prozesses zurück. Diese Funktion ist nur nützlich, wenn die Funktion pcntl_wifexited TRUE zurückgibt.
Der Parameter $status ist die Statusinformation generiert von pcntl_waitpid.
bool pcntl_wifexited(int $status):
Überprüfen Sie, ob der angegebene Status anzeigt, dass der untergeordnete Prozess normal beendet wurde.
bool pcntl_wifsignaled(int $status):
Überprüfen Sie, ob der angegebene Status vorliegt zeigt an, dass der untergeordnete Prozess aufgrund des Empfangs eines bestimmten Signals beendet wurde.
bool pcntl_wifstopped(int $status):
Überprüfen Sie, ob $status anzeigen kann, dass der untergeordnete Prozess derzeit gestoppt ist. Diese Funktion generiert nur $status, wenn darauf reagiert wird WUNTRACED wird von der Funktion pcntl_waitpid als Wert des Parameters $options verwendet. Es ist nur oben gültig.
int pcntl_wstopsig(int $status):
Gibt die Nummer des Signals zurück, das den untergeordneten Prozess durch Analyse von $status stoppt . Diese Funktion ist nur gültig, wenn pcntl_wifsignaled TRUE zurückgibt.
int pcntl_wtermsig(int $status):
Gibt die Signalnummer zurück, die den Prozess unterbricht.

Weitere Artikel zum Thema PHP mit pcntl und libevent zur Implementierung der Timer-Funktion finden Sie auf der chinesischen PHP-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