PHP implements daemon process

藏色散人
Release: 2023-04-07 07:16:02
forward
5379 people have browsed it

PHP implements daemon process

Daemon process

As a resident process service, the daemon process is very common, such as PHP-FPM, NGINX, REDIS, both require a parent process to support the entire service. However, it is rare to write a daemon process in PHP. Let’s use PHP to implement it today.

Steps

● Fork the child process

● Parent process exits

● Set up a new session

● Reset file mask

● Close standard input and output

Implementation

We follow the above steps to implement, before that we need pcntl and posix extensions, make sure they are installed.

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);
}
Copy after login

Details

// 获取进程ID
var_dump(posix_getpid());
// 获取进程组ID
var_dump(posix_getpgid(posix_getpid()));
// 获取进程会话ID    
var_dump(posix_getsid(posix_getpid()));
Copy after login

The three results are the same, indicating that the process is the session leader even if it is the leader of the process group.

Why umask is needed (0)

When you call umask in linux, you will see a mask value. This mask determines the permissions for the files you create. Scope, for example, the umask of my current machine is

0022

The maximum permission of the file is 0666, and the maximum permission of the directory is 0777, then the directory created by the current user The permission is 0755, which is rwx-rx-rx permission for the current user. The file is 0644, which has rw-r-r permissions for the current user. So if there is no reset mask, it will be 0755 for directories and 0644 for files.

Note

If you use functions such as echo var_dump in the process, be sure to redirect the standard output to other file streams. Just add the following code.

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;);
Copy after login

Because the standard input and output has been closed above, the file descriptor fd is no longer available. After reopening, fd will be 0, 1, and 2 starting from non-negative. Files that just serve as standard input and output. Of course, you need to set up the redirection there yourself.

The last second fork

This issue needs to be carefully considered, because it is not necessary. Currently, I can't think of any scenario where Fork is necessary twice.

The above is the detailed content of PHP implements daemon process. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
php
source:learnku.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!