Dieser Artikel stellt hauptsächlich die Methode und den prinzipiellen Prozess zur Realisierung der PHP-Dämonisierung sowie den in der C-Umgebung und PHP-Umgebung implementierten Code vor. Freunde, die ihn mögen, können ihn speichern.
Was ist ein Daemon?
Ein Daemon wird normalerweise als Hintergrundaufgabe betrachtet, die das Terminal nicht steuert. Es zeichnet sich durch drei Besonderheiten aus: Es läuft im Hintergrund, ist von dem Prozess, der es gestartet hat, getrennt und muss nicht das Terminal steuern. Die häufig verwendete Implementierungsmethode ist fork() -> setsid() -> fork()
Es gibt einen Funktions-Daemon. Der Aufruf dieser Funktion kann dazu führen, dass der aktuelle Prozess das Terminal verlässt und zu einem Daemon-Prozess wird. Weitere Informationen finden Sie unter man daemon. Derzeit gibt es in PHP keine solche Funktion. Es gibt zwei Möglichkeiten, die Daemonisierung von PHP-Programmen zu implementieren:
1. Verwenden Sie den Systembefehl nohup
nohup php myprog.txt. Obwohl das ausgeführte Programm auch im Hintergrund ausgeführt wird, hängt es tatsächlich davon ab, ob der Benutzer das Terminal verlässt getötet werden. Sie müssen nohup verwenden, um
2 zu erreichen. Supervisor-Tool verwenden (empfohlene Lösung)
Detaillierte Anleitung zur Verwendung von Supervisor
3. Natürlich kann es auch per Programm implementiert werden (nicht für den Einsatz in Produktionsumgebungen empfohlen) C-Programmimplementierung:
#include#include#include#include#include#include//实现守护进程步骤 void crete_daemon(void) { pid_t pid = 0; pid = fork(); if (pid<0) { perror("fork"); exit(-1); } if (pid > 0) { //1.父进程直接退出 exit(0); } //2. //执行到这里就是子进程 //setsid 将当前进程设置为一个新的会话期session,目的就是 //让当前进程脱离控制台,成为守护进程。 pid = setsid(); if (pid < 0) { perror("setsid"); exit(-1); } //3.设置当前进程的工作目录为根目录,不依赖于其他 chdir("/"); //4.umask设置为0确保将来进程有最大的文件操作权限 umask(0); //5.关闭文件描述符 //先要获取当前系统中所允许打开的最大文件描述符数目 int i = 0; int cnt = sysconf(_SC_OPEN_MAX); for (i=0;i
Testergebnisse:
Daemon-Prozess:
Die beiden wichtigeren PHP-Funktionen hier sind pcntl_fork() und posix_setsid ()
Fork() eines Prozesses bedeutet, dass eine Kopie des laufenden Prozesses erstellt wird. Die Kopie wird als untergeordneter Prozess betrachtet, und der ursprüngliche Prozess wird als übergeordneter Prozess betrachtet. Nachdem fork() ausgeführt wurde, kann es vom Prozess und der Terminalsteuerung, die es gestartet hat, getrennt werden, was auch bedeutet, dass der übergeordnete Prozess frei beendet werden kann. setztid() macht den neuen Prozess zunächst zum „Anführer“ einer neuen Sitzung und sorgt schließlich dafür, dass der Prozess das Terminal nicht mehr kontrolliert. Dies ist auch der kritischste Schritt auf dem Weg zu einem Daemon-Prozess, was bedeutet, dass dies nicht der Fall ist wird erzwungen, wenn das Terminal geschlossen wird. Dies ist ein kritischer Schritt für einen residenten Prozess, der nicht unterbrochen werden kann. Führen Sie den letzten fork() aus. Dieser Schritt ist nicht erforderlich, wird jedoch normalerweise ausgeführt. Seine größte Bedeutung besteht darin, zu verhindern, dass das Steuerterminal abgerufen wird. (Wenn ein Endgerät direkt geöffnet wird und das O_NOCTTY-Flag nicht verwendet wird, wird das Steuerterminal abgerufen)
Andere Dinge:
Der Daemon-Prozess chdir() erbt den aktuellen Status des übergeordneten Geräts Standardmäßig arbeitet der Prozess im Arbeitsverzeichnis. Wenn die Systemfestplatte nicht gemountet ist, wird normalerweise „/“ als aktuelles Arbeitsverzeichnis des Daemon-Prozesses verwendet, wodurch die oben genannten Probleme vermieden werden können erbt standardmäßig die Dateiberechtigungsmaske des übergeordneten Prozesses Dies führt zu großen Problemen bei der Verwendung von Dateien durch den Unterprozess. Daher kann das Festlegen der Dateiberechtigungsmaske auf 0 die Flexibilität des Daemons erheblich verbessern. fclose(STDIN), fclose(STDOUT), fclose(STDERR) schließt den Standard-E/A-Stream. Der mit der Fork-Funktion erstellte untergeordnete Prozess erbt einige geöffnete Dateien vom übergeordneten Prozess. Diese geöffneten Dateien können vom Daemon möglicherweise nie gelesen oder geschrieben werden, verbrauchen jedoch dennoch Systemressourcen und können dazu führen, dass das Dateisystem, in dem sie sich befinden, nicht mehr bereitgestellt werden kann.
Programmierbeispiele für die Multiprozessimplementierung in PHP
PHP implementiert Multiprozess und Multithreading
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die PHP-Daemonisierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!