デーモン プロセス
デーモン プロセスは、常駐プロセス サービスとして、PHP-FPM などの非常に一般的なものです。 、NGINX、REDIS のいずれも、サービス全体をサポートするには親プロセスが必要です。しかし、デーモンプロセスを PHP で書くことは稀なので、今日は PHP を使って実装してみましょう。
#手順##● 子プロセスをフォークする
##● 親プロセスが終了する##● 新しいセッションをセットアップする
● ファイルマスクのリセット
##標準入力と出力を閉じる##実装##上記の手順に従って実装します。その前に、pcntl が必要です。および posix 拡張機能がインストールされていることを確認してください。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); }
詳細
// 获取进程ID var_dump(posix_getpid()); // 获取进程组ID var_dump(posix_getpgid(posix_getpid())); // 获取进程会话ID var_dump(posix_getsid(posix_getpid()));3 つの結果は同じであり、プロセスがプロセス グループのリーダーであっても、セッション リーダーであることを示しています。
umask が必要な理由 (0)
Linux で umask を呼び出すと、マスク値が表示されます。このマスクは、作成するファイルのアクセス許可を決定します。スコープ。たとえば、現在のマシンの umask は0022
ファイルの最大権限は 0666、ディレクトリの最大権限は 0777 です。次に、現在のユーザーによって作成されたディレクトリです。権限は 0755 で、これは現在のユーザーの rwx-rx-rx 権限です。ファイルは 0644 で、現在のユーザーには rw-r-r 権限があります。したがって、リセットマスクがない場合、ディレクトリの場合は 0755、ファイルの場合は 0644 になります。注意
プロセス内で echo var_dump などの関数を使用する場合は、必ず標準出力を他のファイル ストリームにリダイレクトしてください。次のコードを追加するだけです。global $stdin, $stdout, $stderr; $stdin = fopen('/dev/null', 'r'); $stdout = fopen('/www/php/txt.txt','wb'); $stderr = fopen('/dev/null', 'wb');上記で標準入出力が閉じられたため、ファイル記述子 fd は利用できなくなりました。再度開くと、fd は非負から始まる 0、1、2 になります。標準入出力としてのみ機能するファイル。もちろん、そこにリダイレクトを自分で設定する必要があります。
最後の 2 番目のフォーク
この問題は必須ではないため、慎重に検討する必要があります。現時点では、Fork が 2 回必要になるシナリオは思いつきません。以上がPHPはデーモンプロセスを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。