Daemon-Prozess
Daemon-Prozess ist eine Art residenter Prozessdienst, der sehr verbreitet ist, wie z. B. PHP -FPM, NGINX, REDIS, beide erfordern einen übergeordneten Prozess, um den gesamten Dienst zu unterstützen. Es ist jedoch selten, einen Daemon-Prozess in PHP zu schreiben. Verwenden wir heute PHP, um ihn zu implementieren.
Schritte
● Untergeordneten Prozess forken
● Beenden des übergeordneten Prozesses
● Neue Sitzung einrichten
● Dateimaske zurücksetzen
● Standardeingabe und -ausgabe schließen
Implementierung
Zur Implementierung folgen wir den oben genannten Schritten, davor benötigen wir pcntl und posix Stellen Sie sicher, dass Erweiterungen installiert sind.
function daemon() { $pid = pcntl_fork(); // fork 失败 if ($pid < 0) { exit('fork failed'); } else if ($pid > 0) { // 退出父进程 exit(0); } // 设置新的会员 // setsid 有几个注意点 // 不能是进程组的组长调用 // 对于进程组组员调用会产生新的会话和进程组,并成为该进程组的唯一成员,调用的进程将脱离终端 if (posix_setsid() < 0) { exit('set sid failed'); } // 重置文件掩码 umask(0); // 切换工作目录 chdir('/'); // 关闭标准输入输出 fclose(STDIN); fclose(STDOUT); fclose(STDERR); }
Details
// 获取进程ID var_dump(posix_getpid()); // 获取进程组ID var_dump(posix_getpgid(posix_getpid())); // 获取进程会话ID var_dump(posix_getsid(posix_getpid()));
Die Ergebnisse der drei sind die gleichen, was zeigt, dass der Prozess auch der Sitzungsleiter ist, selbst wenn er der Leiter der Prozessgruppe ist .
Warum umask benötigt wird (0)
Wenn Sie umask unter Linux aufrufen, sehen Sie einen Maskenwert, der die Berechtigungen für die von Ihnen erstellten Dateien bestimmt. Scope, zum Beispiel ist die Umask meines aktuellen Computers
0022
Die maximale Berechtigung der Datei beträgt 0666 und die maximale Berechtigung des Verzeichnisses beträgt 0777. dann das vom aktuellen Benutzer erstellte Verzeichnis Die Berechtigung lautet 0755, was der rwx-rx-rx-Berechtigung für den aktuellen Benutzer entspricht. Die Datei ist 0644 und verfügt über rw-r-r-Berechtigungen für den aktuellen Benutzer. Wenn also keine Reset-Maske vorhanden ist, lautet sie 0755 für Verzeichnisse und 0644 für Dateien.
Hinweis
Wenn Sie dabei Funktionen wie echo var_dump verwenden, achten Sie darauf, die Standardausgabe auf andere Dateistreams umzuleiten. Fügen Sie einfach den folgenden Code hinzu.
global $stdin, $stdout, $stderr; $stdin = fopen('/dev/null', 'r'); $stdout = fopen('/www/php/txt.txt','wb'); $stderr = fopen('/dev/null', 'wb');
Da die Standardeingabe und -ausgabe oben geschlossen wurde, ist der Dateideskriptor fd nicht mehr verfügbar. Nach dem erneuten Öffnen ist fd 0, 1 und 2, beginnend mit nicht negativ. Dateien, die lediglich als Standardeingabe und -ausgabe dienen. Natürlich müssen Sie die Umleitung dort selbst einrichten.
Der Last-Second-Fork
Dieses Problem muss sorgfältig geprüft werden, da es nicht notwendig ist. Derzeit kann ich mir kein Szenario vorstellen, in dem Fork zweimal notwendig wäre.
Das obige ist der detaillierte Inhalt vonPHP implementiert den Daemon-Prozess. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!