ホームページ  >  記事  >  バックエンド開発  >  CおよびPHP環境でのデーモンプロセスの実装例

CおよびPHP環境でのデーモンプロセスの実装例

*文
*文オリジナル
2017-12-25 10:40:451463ブラウズ

デーモンは通常、端末を制御しないバックグラウンド タスクとして考えられます。この記事では主に、C環境とPHP環境でPHPデーモンプロセスを実装する方法と原則的なプロセスを紹介します。 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


テスト結果:

デーモンプロセス:


ここでのより重要な 2 つの関数 最初の PHP 関数は、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チュートリアル

Windows上のphp-cgiプロセスデーモン

PHP はプロセスをデーモン メソッド、php プロセス デーモンとして使用します

以上がCおよびPHP環境でのデーモンプロセスの実装例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。