php守护进程

<?php
/**
 * daemonize让当前脚本为守护进程执行
 * @param string $callback 匿名函数
 */
function daemonize($callback)
{
    //创建子进程
    $pid = pcntl_fork();
    if ($pid < 0)
    {
        exit('创建子进程失败退出');
    }
    elseif ($pid)
    {
        exit('主进程退出');
    }
    else
    {
        /**
         * 创建一个新的会话,并让这个pid统治这个会话,他既是会话组长,也是进程组长。
         * 关机除外,谁也没法控制这个会话,除了这个pid。
         * 注意:posix_setsid()函数需要当前进程不是父进程,或者说不是会话组长。
         * 在这里当然不是,因为父进程已经被kill
         */
        //设置子进程为会话leader
        $sid = posix_setsid();
        if ($sid < 0)
        {
            exit('设置子进程为leader失败');
        }
        $callback();
    }
}

//执行任务来测试
$callback = function () {
    for ($i=0;$i<10000;$i++)
    {
        file_put_contents('1.txt',$i.PHP_EOL,FILE_APPEND);
    }
};
daemonize($callback);

先让主进程退出,然后设置子进程为会话组长即可。

最后修改:2021 年 01 月 17 日 10 : 41 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论