ホームページ  >  記事  >  バックエンド開発  >  PHPはデーモンプロセスを実装します

PHPはデーモンプロセスを実装します

藏色散人
藏色散人転載
2019-08-09 14:13:285421ブラウズ

PHPはデーモンプロセスを実装します

デーモン プロセス

デーモン プロセスは、常駐プロセス サービスとして、PHP-FPM などの非常に一般的なものです。 、NGINX、REDIS のいずれも、サービス全体をサポートするには親プロセスが必要です。しかし、デーモンプロセスを PHP で書くことは稀なので、今日は PHP を使って実装してみましょう。

#手順##● 子プロセスをフォークする

##● 親プロセスが終了する

##● 新しいセッションをセットアップする

● ファイルマスクのリセット

##標準入力と出力を閉じる

##実装

##上記の手順に従って実装します。その前に、pcntl が必要です。および posix 拡張機能がインストールされていることを確認してください。

function daemon() {
    $pid = pcntl_fork();
    // fork 失败
    if ($pid < 0) {
        exit(&#39;fork failed&#39;);
    } else if ($pid > 0) {
       // 退出父进程
        exit(0);
    }
    // 设置新的会员
    // setsid 有几个注意点
    // 不能是进程组的组长调用
    // 对于进程组组员调用会产生新的会话和进程组,并成为该进程组的唯一成员,调用的进程将脱离终端
    if (posix_setsid() < 0) {
        exit(&#39;set sid failed&#39;);
    }
    // 重置文件掩码
    umask(0);
    // 切换工作目录
    chdir(&#39;/&#39;);
    // 关闭标准输入输出
    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(&#39;/dev/null&#39;, &#39;r&#39;);
$stdout = fopen(&#39;/www/php/txt.txt&#39;,&#39;wb&#39;);
$stderr = fopen(&#39;/dev/null&#39;, &#39;wb&#39;);

上記で標準入出力が閉じられたため、ファイル記述子 fd は利用できなくなりました。再度開くと、fd は非負から始まる 0、1、2 になります。標準入出力としてのみ機能するファイル。もちろん、そこにリダイレクトを自分で設定する必要があります。

最後の 2 番目のフォーク

この問題は必須ではないため、慎重に検討する必要があります。現時点では、Fork が 2 回必要になるシナリオは思いつきません。

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

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。