PHP code example of hectorqin / php-resque

1. Go to this page and download the library: Download hectorqin/php-resque library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

hectorqin / php-resque example snippets





use Psr\Log\LogLevel;
use Resque\Listener\StatsListener;
use Resque\WorkerManager;

return [
    // 是否守护进程
    'daemonize'       => false,
    // redis 数据库信息
    'redis_backend'   => '',
    // redis 数据库编号
    'redis_database'  => '',
    // worker消费间隔
    'interval'        => 5,
    // worker组
    'worker_group'    => [
        [
            "type"  => "Worker",
            "queue" => "deault",
            "nums"  => 1,
        ],
        [
            "type"  => "SchedulerWorker",
            "queue" => "default",
            "nums"  => 1,
        ],
        [
            "type"     => "CustomWorker",
            "queue"    => "dump_date",
            'interval' => 5,
            "nums"     => 2,
            // 可使用闭包
            "handler"  => function () {
                WorkerManager::log("current datetime" . date("Y-m-d H:i:s"));
            },
        ],
        [
            "type"        => "CrontabWorker",
            "queue"       => "crontab",
            "nums"        => 2,
            "workerQueue" => "default",
        ],
    ],

    // 动态加载文件,使用 glob 函数
    'app_>'mycrontab',"rule"=>"0 * * * * *","handler"=>callable,"params"=>[]]
    // name 名称,rule 定时规则,handler 回调函数(不能使用闭包,闭包可以用opis/closure包装一下),params 回调参数
    // 必须启动 CrontabWorker 和 SchedulerWorker
    'worker_crontab' => [

    ],
];

use Resque\Job\SimpleJob;

// 投递到 default 队列
SimpleJob::default([
    'handler' => ['\\app\\index\\controller\\Index', 'job'],
    'params'  => [
        'hello' => 0
    ], // ThinkPHP 支持参数绑定,其他框架请按照参数顺序传值
], true);

// 投递到 task 队列,延迟10秒执行
SimpleJob::task([
    'handler' => ['\\app\\index\\controller\\Index', 'job'],
    'params'  => [
        'hello' => 0
    ], // ThinkPHP 支持参数绑定,其他框架请按照参数顺序传值
], true, 10);

// 投递到 task 队列,定时执行
SimpleJob::task([
    'handler' => ['\\app\\index\\controller\\Index', 'job'],
    'params'  => [
        'hello' => 0
    ], // ThinkPHP 支持参数绑定,其他框架请按照参数顺序传值
], true, strtotime("2020-12-01"));


namespace app\index\controller;

class Index
{
    function job($hello) {
        echo $hello;
    }
}

use Resque\Job\SimpleJob;
use Resque\Job;

/**
 * 自定义任务
 * @property array $args 任务参数
 * @property Job $job 任务对象
 * @property string $queue 队列名称
 */
class MyJob extends SimpleJob
{
    /**
     * 任务执行逻辑
     *
     * TP支持参数绑定,其余框架仅支持数组参数
     *
     * @return mixed
     * @throws ThinkException
     * @throws InvalidArgumentException
     * @throws ClassNotFoundException
     */
    public function execute($hello)
    {
        // 自定义任务逻辑
    }

    /**
     * 成功回调
     *
     * @return void
     */
    public function onSuccess()
    {
    }

    /**
     * 失败回调
     * @return void
     */
    public function onError()
    {
    }
}

// 投递任务
MyJob::enqueue([
    'hello' => 1
]);

// 延迟3秒执行任务
MyJob::enqueueAt([
    'hello' => 1
], 3);

// 一个小时后执行任务
MyJob::enqueueAt([
    'hello' => 1
], time() + 3600);

(new MyJob())->delay(5)->executeAsync($param1, $param2);

// Worker、SchedulerWorker、CustomWorker、CrontabWorker 启动事件
Event::listen('onWorkerStart', [$this, 'onWorkerStart']);
// Worker 创建job进程前事件
Event::listen('beforeForkExecutor', [$this, 'beforeForkExecutor']);
// Worker 创建job进程后事件
Event::listen('afterForkExecutor', [$this, 'afterForkExecutor']);
// 任务执行前事件
Event::listen('beforePerformJob', [$this, 'beforePerformJob']);
// 任务执行后事件
Event::listen('afterPerformJob', [$this, 'afterPerformJob']);
// 任务执行失败事件
Event::listen('onJobFailed', [$this, 'onJobFailed']);
// Worker、SchedulerWorker、CustomWorker、CrontabWorker 关闭事件
Event::listen('onWorkerStop', [$this, 'onWorkerStop']);
// 任务入队前事件
Event::listen('beforeEnqueue', [$this, 'beforeEnqueue']);
// 任务入队后事件
Event::listen('afterEnqueue', [$this, 'afterEnqueue']);
// 延迟/定时任务进入定时队列后事件
Event::listen('afterSchedule', [$this, 'afterSchedule']);
// 延迟/定时任务进入执行队列前事件
Event::listen('beforeDelayedEnqueue', [$this, 'beforeDelayedEnqueue']);

Class Test
{
    use \Resque\Concern\MagicCall;

    /**
     * 任务执行 handler
     */
    function testResque($name)
    {
        trace('Hello ' . $name);
    }

    function test()
    {
        // 设置默认同步执行,不使用队列,可用于调试
        // $this->setSync(true);
        $this->setDefaultQueue('default');
        // 任务 handler方法名 + Async 即可投递任务,参数顺序保持一致,方便调试
        $this->testResqueAsync('hector');
        $this->delay(5)->testResqueAsync('hector');
        $this->at(time() + 10)->testResqueAsync('hector');
        $this->at(time() + 15)->handler([\get_class(), 'testResque'], [
            'hector'
        ])->send();

        // 同步执行,不使用队列,调试用
        $this->sync(true)->testResqueAsync('hector');
    }
}

$test = new Test();
$test->test();

bash
composer 
bash
# 测试
./vendor/bin/resque

# ThinkPHP使用
php think resque start
# 守护进程
php think resque start -d