Signalverarbeitung für PHP-Programmierer

藏色散人
Freigeben: 2023-04-09 18:06:02
nach vorne
3205 Leute haben es durchsucht

Tutorial zur Signalverarbeitung für PHP-Programmierer

Heute Abend habe ich geschmortes Schweinefleisch gegessen, und das Mädchen am Tisch fragte mich: Kann man das essen? Ich: Du kannst es essen, wenn du denkst, dass du es kannst. . . Ein Thema, das nichts mit dem Inhalt zu tun hat

Was ist ein Signal? Ein Signal ist ein Benachrichtigungsmechanismus (auch Software-Interrupt genannt) für den Prozess, wenn ein Ereignis auftritt. Wenn ein Prozess ein Signal empfängt, unterbricht der Kernel den vom Prozess ausgeführten Code und springt zur entsprechenden Signalverarbeitungsfunktion. Wenn die Verarbeitungsfunktion nicht unterbricht, wird die Ausführung nach der Ausführung der Verarbeitungsfunktion an der Stelle fortgesetzt, an der sie unterbrochen wurde. implementieren.

Wir schreiben Code im FPM-Modus und werden keine Probleme im Zusammenhang mit der Signalverarbeitung haben. Wie können jedoch einige speicherresidente Skripte im CLI-Modus frei neu gestartet, heruntergefahren und einige Aufräumarbeiten durchgeführt werden, bevor sie beendet werden (Verbindung trennen). , temporäre Dateien löschen usw.)?

C-Signalverarbeitungsbeispiel

Signalverarbeitung für PHP-ProgrammiererIm Bild oben habe ich die Verarbeitungsfunktion sigint_handle für das Signal SIGINT nach der Signalerfassung und nach der Ausgabe registriert Der Inhalt ist einfach und leicht verständlich. Führen Sie gcc -o run run.c && ./run aus, dann STRG+C (das Signal SIGINT wird ausgelöst) und erfolgreiche Ausgabe : Signal 2 wurde erfolgreich erfasst!, und das Programm wird sofort beendet. Beispiel für die PHP-Signalverarbeitung 5605e8a17d80b .png"/>

SIGINT注册了处理函数sigint_handle,捕获到信号后,输出内容后退出,简单易懂吧。执行 gcc -o run run.c && ./run ,然后CTRL+C(会触发SIGINT信号),成功输出:成功捕获到信号2!,程序直接结束运行。

PHP的信号处理举例

Signalverarbeitung für PHP-Programmierer

pcntl_signal是PHP的信号处理注册方法,上面实现的功能和C实现的基本一致,不同的是,当前进程不会退出,并且多输出了一个signinfo(PHP是C写的,为啥刚刚C语言的没有信号相关的信息呢?因为PHP使用的是另一个信号函数sigaction,有兴趣的可以了解一下)

PHP的信号处理并不是直接调用C

Signalverarbeitung für PHP-Programmierer

这个是pcntl初始化的时候,将pcntl_signal_dispatch注册为tick的处理函数

Signalverarbeitung für PHP-Programmierer

pcntl_signal会将处理函数放到信号集合中(PHP的hash table),而php_signale4最终会调用sigaction进行底层的信号管理。

Signalverarbeitung für PHP-Programmierer

这里我省略了大量代码,将关键的点标记了出来,其实PHP维护一个自己的信号集合,每当调用pcntl_signal_dispatch时就会查询是否有信号,上面的SIG_BLOCK会将信号阻塞,这样只有我们把关键的代码执行完毕之后,再去触发信号处理函数以保证数据和程序逻辑的完整性。

PHP如何优雅的处理信号

经常见到身边的程序员们,每当需要重启PHP-FPM进程的时候,使用的招数是kill掉所有PHP进程,然后新启动。一般情况没啥问题,但有些时候可能某个进程的任务还没执行完,直接把人家中断了略显粗暴。其实只要你给PHP的Master进程发送一条USR2信号,它便会再处理完所有任务后,重启子进程,这才是所谓的优雅~

Signalverarbeitung für PHP-Programmierer

上图是我简单写的一个例子,如果我们想让进程优雅退出的时候,只需要发送SIGTERM信号即可。需要注意的是SIGKILLSIGSTOP信号会略过信号阻塞会将进程直接停止,还有就是信号会中断睡眠(SLEEP),sleeppcntl_signal ist die Signalverarbeitungsregistrierungsmethode von PHP. Die oben implementierten Funktionen sind grundsätzlich dieselben wie die in C implementierten. Der Unterschied besteht darin, dass der aktuelle Prozess nicht beendet wird und Geben Sie noch eine signinfo aus (PHP ist in C geschrieben. Warum gibt es derzeit keine signalbezogenen Informationen in der C-Sprache? Weil PHP eine andere Signalfunktion sigaction verwendet, diejenigen, die es sind Interessierte können mehr darüber erfahren)

PHPs Signalverarbeitung ruft C nicht direkt auf

Signalverarbeitung für PHP-Programmierer🎜🎜Wenn pcntl initialisiert wird, registrieren Sie pcntl_signal_dispatch als Tick-Verarbeitungsfunktion🎜🎜Signalverarbeitung für PHP-Programmierer 🎜🎜Hier Ich habe viel Code weggelassen und die wichtigsten Punkte markiert. Tatsächlich fragt PHP bei jedem Aufruf von pcntl_signal_dispatch ab, ob ein Signal vorhanden ist code> blockiert das Signal, sodass wir erst nach Abschluss der Ausführung des Schlüsselcodes die Signalverarbeitungsfunktion auslösen können, um die Integrität der Daten und der Programmlogik sicherzustellen. 🎜🎜Wie PHP mit Signalen elegant umgeht🎜🎜Ich sehe oft Programmierer um mich herum, wenn sie den <code>PHP-FPM-Prozess neu starten müssen, der Trick, den sie anwenden, besteht darin, alle PHP-Prozesse zu beenden und dann einen neuen zu starten . . Im Allgemeinen gibt es kein Problem, aber manchmal wird die Aufgabe eines bestimmten Prozesses möglicherweise nicht abgeschlossen und es wäre etwas unhöflich, ihn direkt zu unterbrechen. Solange Sie ein USR2-Signal an den PHP-Master-Prozess senden, werden alle Aufgaben abgeschlossen und der untergeordnete Prozess neu gestartet. Dies ist die sogenannte Eleganz~🎜🎜 541FC1FC34BABFE57D6666790F55 .png 是 Das Bild oben ist ein Beispiel, das ich einfach schreibe Wenn wir möchten, dass der Prozess ordnungsgemäß beendet wird, müssen wir nur das Signal SIGTERM senden. Es ist zu beachten, dass die Signale SIGKILL und SIGSTOP die Signalblockierung überspringen und den Prozess direkt stoppen und das Signal den Ruhezustand (SLEEP), sleepWenn die Ausführung nicht abgeschlossen ist, werden die verbleibenden Sekunden zurückgegeben. Wenn Sie interessiert sind, können Sie es versuchen. 🎜🎜Es gibt tatsächlich viele Wissenspunkte im Zusammenhang mit Signalen, und wir müssen sie weiterhin eingehend untersuchen. ~ Der obige PHP-Quellcode ist Version 7.1.25, und jede Version kann unterschiedlich sein. 🎜🎜

Das obige ist der detaillierte Inhalt vonSignalverarbeitung für PHP-Programmierer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!