この記事では、PHP デーモン化を実現する方法と原理的なプロセスを主に紹介し、C 環境と PHP 環境で実装されたコードを気に入った人は保存してください。
デーモンとは何ですか?
デーモンは通常、端末を制御しないバックグラウンドタスクであると考えられています。これには 3 つの特徴があります。バックグラウンドで実行されること、起動したプロセスから分離されること、端末を制御する必要がないことです。よく使われる実装方法は fork() -> setsid() -> fork() です
glibc には関数デーモンがあります。この関数を呼び出すと、現在のプロセスがターミナルから離れ、デーモン プロセスになる可能性があります。詳細については、「man デーモン」を参照してください。現在、PHP にはそのような関数はありません。PHP プログラムのデーモン化を実装するには 2 つの方法があります。
1.システムコマンド nohup
nohup php myprog.php > を使用します。プログラムはバックグラウンドで実行されますが、ユーザーがターミナルを終了すると、プロセスは強制終了されます。実現するにはnohupを使用する必要があります
2.スーパーバイザー ツールを使用します (このソリューションを推奨します)
スーパーバイザーの使用に関する詳細なチュートリアル
3.もちろん、プログラムによって実装することもできます (本番環境での使用は推奨されません) C プログラムの実装:
#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
テスト結果:
デーモンプロセス:
ここではさらに重要な PHP を 2 つ紹介します。関数は pcntl_fork() と posix_setsid() です。
fork() はプロセスです。つまり、実行中のプロセスのコピーが作成され、そのコピーが子プロセスとみなされ、元のプロセスが子プロセスとみなされます。親プロセス。 fork() の実行後、fork() を開始したプロセスおよび端末コントロールから分離できます。これは、親プロセスが自由に終了できることも意味します。 etsid() を実行すると、まず新しいプロセスが新しいセッションの「リーダー」になり、最後にプロセスが端末を制御しなくなります。これは、デーモン プロセスになるための最も重要なステップでもあります。つまり、デーモン プロセスではなくなります。ターミナルが閉じられると強制的にプロセスが終了します。これは、中断できない常駐プロセスにとって重要なステップです。最後の fork() を実行します。このステップは必須ではありませんが、通常は制御端末が取得されないようにするために実行されます。 (端末デバイスが直接オープンされ、O_NOCTTY フラグが使用されない場合、制御端末が取得されます)
その他の注意事項:
chdir() デーモンプロセスは、アンマウント時にデフォルトで親プロセスの現在の作業ディレクトリを継承します。これは多くの問題を引き起こします。通常、「/」はデーモン プロセスの現在の作業ディレクトリとして使用され、umask() デーモン プロセスは親のファイル許可マスクを継承します。デフォルトで子プロセスにファイルバンドを使用するプロセスが発生しました。したがって、ファイル許可マスクを 0 に設定すると、fclose(STDIN)、fclose(STDOUT)、fclose(STDERR) のデーモンの柔軟性が大幅に向上し、標準 I/O ストリームを閉じることができます。 fork 関数を使用して作成された子プロセスは、親プロセスから開いているファイルの一部を継承します。これらの開かれたファイルはデーモンによって読み書きされることはありませんが、それでもシステム リソースを消費し、ファイルが存在するファイル システムがマウント不能になる可能性があります。
以上がPHPのデーモン化を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。