当前位置:首页 > PHP > 正文内容

php多进程实现任务管理器,定时执行任务,支持守护

高老师6年前 (2019-04-03)PHP1687

主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:

<?php
/**
 * 订单任务
 */
class Order
{
    public function run()
    {
        file_put_contents("log1.txt", '我是订单任务,本次运行时间:' . date('Y-m-d H:i:s') . "\r\n", FILE_APPEND);
    }
}

/**
 * 商品任务
 */
class Goods
{
    public function run()
    {
        file_put_contents("log2.txt", '我是商品任务,本次运行时间:' . date('Y-m-d H:i:s') . "\r\n", FILE_APPEND);
    }
}


/**
 * Task任务核心
 */
class Console
{
    /**
     * 定时任务配置和执行时间间隔
     */
    protected static $tasks = [
        'Order' => 5,
        'Goods' => 10,
    ];

    /**
     * 初始化为每个任务分配进程
     */
    public static function init()
    {
        $tasks = self::$tasks;

        foreach ($tasks as $task => $second)
        {
            //创建子进程
            $pid = pcntl_fork();

            if ($pid == -1)
            {
                die ('创建子进程失败!');
            }
            elseif ($pid)
            {
                //等待子进程执行完成回收,并且设置非阻塞
                pcntl_wait($status, WNOHANG);
            }
            else
            {
                self::process($task, $second);
                //子进程执行完成关闭,避免重复fork
                die();
            }
        }
    }

    /**
     * 子进程闹钟处理任务
     */
    public static function process($task, $second)
    {
        //安装信号管理
        pcntl_signal(SIGALRM, function () use ($task, $second) {
            pcntl_alarm($second);
            $taskObj = new $task();
            call_user_func([$taskObj, 'run']);
        }, false);

        //发送闹钟信号
        pcntl_alarm($second);

        //调用等待信号的处理器
        while (true)
        {
            pcntl_signal_dispatch();
        }
    }
}

//初始化
Console::init();

程序执行后.主进程会根据已经配置的任务数来分配子进程,每个子进程来定时执行对应的任务,可以用来做redis消费者。

以上只是给你一个思路来实现,你还可以直接用我开源的定时器直接使用,访问地址:https://gitee.com/392223903/EasyTask

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/82.html

分享给朋友:

“php多进程实现任务管理器,定时执行任务,支持守护” 的相关文章

php 将数组键值转为变量

php 将数组键值转为变量

<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...

php异步执行,php后台运行,如何在windows下让php后台运行

php异步执行,php后台运行,如何在windows下让php后台运行

如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php  D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...

PHP异常处理,PHP自定义错误,PHP记录错误日志

PHP异常处理,PHP自定义错误,PHP记录错误日志

面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpa...

Thinkphp Call Stack,PHP调用栈Call Stack的获取

Thinkphp Call Stack,PHP调用栈Call Stack的获取

ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...

PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl.dll找不到指定的模块

PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl.dll找不到指定的模块

最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...