Heim >Backend-Entwicklung >PHP-Tutorial >So verwenden Sie asynchrone Aufgaben, um die Hintergrundverarbeitung in PHP zu implementieren

So verwenden Sie asynchrone Aufgaben, um die Hintergrundverarbeitung in PHP zu implementieren

WBOY
WBOYOriginal
2023-06-27 15:10:421335Durchsuche

Bei der Webentwicklung dauern einige Aufgaben lange, z. B. die Datenverarbeitung, das Hochladen von Dateien, das Versenden von E-Mails usw. Wenn diese Vorgänge im Vordergrund ausgeführt werden, führt dies zu einer schlechten Benutzererfahrung und sogar dazu, dass die Seite für längere Zeit nicht mehr reagiert. Daher kann die Verwendung asynchroner Aufgaben diese Aufgaben in den Hintergrund verlagern, die Parallelitätsfähigkeit des Systems verbessern und auch das Benutzererlebnis und die Interaktion im Vordergrund reibungsloser gestalten.

PHP bietet als beliebte serverseitige Skriptsprache auch gute Unterstützung für die Implementierung asynchroner Aufgaben. In diesem Artikel wird erläutert, wie Sie mit asynchronen Aufgaben die Hintergrundverarbeitung in PHP implementieren.

Prinzipien und Methoden

Das Implementierungsprinzip asynchroner Aufgaben besteht darin, die Aufgaben im Hintergrund zu verarbeiten, sodass das Programm in diesem Zeitraum andere Aufgaben ausführen kann. Diese Funktion kann durch die folgenden PHP-Erweiterungsmodule erreicht werden:

  1. pcntl: Hintergrundaufgaben durch den Fork-Prozess realisieren.
  2. posix: Wird zur Verarbeitung prozessbezogener Systemaufrufe wie Signale, Sperren usw. verwendet.
  3. swoole: Eine leistungsstarke asynchrone, parallele und koroutinene Netzwerkkommunikations-Engine basierend auf der Epoll-Technologie.

Unter diesen ist swoole das neueste und am meisten empfohlene Erweiterungsmodul, das die meisten Funktionen unterstützt, am schnellsten ist und über die leistungsstärksten Funktionen verfügt.

Verwenden Sie pcntl, um Hintergrundaufgaben zu implementieren

pcntl ist eine PHP-Erweiterung, die eine Reihe von Prozesssteuerungsfunktionen bereitstellt. Über die Funktion pcntl_fork() kann ein untergeordneter Prozess erstellt werden, der Hintergrundaufgaben erledigt. Die spezifische Implementierungsmethode lautet wie folgt:

// 创建子进程
$pid = pcntl_fork();

if ($pid === -1) {
    die('could not fork');
}
// 父进程
elseif ($pid) {
    // 执行父进程代码...
    pcntl_wait($status);
}
// 子进程
else {
  // 执行子进程代码...
  exit;
}

Im obigen Code gibt die Funktion pcntl_fork() einen ganzzahligen Wert zurück. Wenn der Wert -1 ist, bedeutet dies, dass die Erstellung des untergeordneten Prozesses fehlgeschlagen ist. Dies bedeutet, dass es sich derzeit um einen untergeordneten Prozess handelt. Wenn der Wert größer als 0 ist, bedeutet dies, dass es sich derzeit um den übergeordneten Prozess handelt.

Zu diesem Zeitpunkt kann der untergeordnete Prozess Hintergrundaufgaben ausführen, z. B. geplante Aufgaben, Dateiverarbeitung usw. Es ist zu beachten, dass die Verwendung von pcntl in einer Online-Umgebung vermieden werden sollte, da pcntl nur mit Befehlszeilenskripts funktioniert.

Verwenden Sie Posix, um Hintergrundaufgaben zu implementieren

Für Webserver wie Apache und Nginx müssen Sie Posix-Erweiterungen für die Prozessverwaltung verwenden. Posix bietet einige prozessmanagementbezogene Funktionen, wie z. B. posix_kill(), posix_getpid() usw. Unter anderem kann die Funktion posix_kill() Signale an den Prozess senden, um sein Verhalten zu steuern.

Die Methode zur Verwendung von Posix zum Implementieren von Hintergrundaufgaben ist wie folgt:

// 创建子进程
$pid = posix_getpid();
$child_pid = pcntl_fork();

if (0 === $child_pid) {
  // 子进程代码...
  sleep(10);
  posix_kill($pid, SIGUSR1); //给父进程发送SIGUSR1信号
  exit();
}

// 父进程等待信号
pcntl_signal(SIGUSR1, function ($sig) {
  //在这里执行异步任务
  echo "Received signal: {$sig}
";
  die();
});

Im untergeordneten Prozess stellt die Funktion sleep () die Ausführungszeit der asynchronen Aufgabe dar. Wenn die asynchrone Aufgabe abgeschlossen ist, verwenden Sie die Funktion posix_kill(), um das Signal SIGUSR1 an den übergeordneten Prozess zu senden und anzuzeigen, dass die Aufgabe abgeschlossen ist. Im übergeordneten Prozess wird die Funktion pcntl_signal() verwendet, um auf das Eintreffen des Signals zu warten, das den Abschluss der asynchronen Aufgabe darstellt.

Verwenden Sie swoole, um Hintergrundaufgaben zu implementieren

swoole ist ein leistungsstarkes, asynchrones PHP-Coroutine-Framework, das ein asynchrones Programmiermodell ereignisgesteuert implementiert. swoole stellt eine swoole_process-Klasse zum Verwalten der Erstellung, Ausführung und Beendigung von untergeordneten Prozessen bereit. Der spezifische Implementierungscode lautet wie folgt:

$process = new swoole_process(function (swoole_process $worker) {
  // 子进程执行的代码
});

$pid = $process->start();
$swoole_event_add($process->pipe, function ($pipe) use ($process) {
  $recv = $process->read();
  echo "received data: ". $recv;
});

$process->write('hello'); // 向子进程中发送消息

Im obigen Code wird ein Unterprozess mithilfe der Klasse swoole_process erstellt, und der Unterprozess kann über die Methode start() gestartet werden. Wenn das Programm im untergeordneten Prozess eine Nachricht an den Hauptprozess senden muss, verwenden Sie die Methode write (), um Daten in die Pipe zu schreiben. Ein anderer Prozess kann die Daten in der Pipe lesen, indem er Pipe-Ereignisse abhört. Auf diese Weise wird eine prozessübergreifende Kommunikation erreicht und dadurch asynchrone Aufgaben implementiert.

Zusammenfassung

Asynchrone Aufgaben werden häufig in der Webentwicklung verwendet. Asynchrone Aufgaben können in PHP über die Erweiterungen pcntl, posix und swoole implementiert werden. Unter diesen ist Swoole die umfassendste und empfohlene Methode. Durch das Verständnis dieser Methoden können Entwickler die geeignete Methode zum Implementieren asynchroner Aufgaben basierend auf spezifischen Geschäftsanforderungen auswählen. Dies wird dazu beitragen, die Parallelitätsfähigkeiten und die Benutzererfahrung des Systems zu verbessern.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie asynchrone Aufgaben, um die Hintergrundverarbeitung in PHP zu implementieren. 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