{"id":17962938,"url":"https://github.com/hectorqin/php-resque","last_synced_at":"2025-03-25T04:32:49.934Z","repository":{"id":56704054,"uuid":"294070018","full_name":"hectorqin/php-resque","owner":"hectorqin","description":"php-resque for ThinkPHP5/6, ThinkPHP3.2","archived":false,"fork":false,"pushed_at":"2021-07-02T08:08:24.000Z","size":150,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-08-07T05:50:56.410Z","etag":null,"topics":["php-resque","thinkphp5","thinkphp6","tp3","worker"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hectorqin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-09T09:45:39.000Z","updated_at":"2022-08-11T15:01:56.000Z","dependencies_parsed_at":"2022-08-15T23:40:22.999Z","dependency_job_id":null,"html_url":"https://github.com/hectorqin/php-resque","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hectorqin%2Fphp-resque","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hectorqin%2Fphp-resque/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hectorqin%2Fphp-resque/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hectorqin%2Fphp-resque/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hectorqin","download_url":"https://codeload.github.com/hectorqin/php-resque/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":222035693,"owners_count":16919925,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php-resque","thinkphp5","thinkphp6","tp3","worker"],"created_at":"2024-10-29T11:21:18.092Z","updated_at":"2024-10-29T11:21:19.194Z","avatar_url":"https://github.com/hectorqin.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PHP-Resque\n\n- [PHP-Resque](#php-resque)\n  - [安装](#安装)\n  - [配置](#配置)\n  - [使用](#使用)\n    - [启动worker](#启动worker)\n    - [投递任务](#投递任务)\n      - [简单任务](#简单任务)\n      - [自定义任务](#自定义任务)\n    - [监听事件](#监听事件)\n    - [快捷投递任务](#快捷投递任务)\n\n在 [chrisboulton/php-resque](https://github.com/chrisboulton/php-resque) 的基础上进行了如下改造：\n\n- 采用psr-4自动加载规范\n- 合并 php-resque-scheduler\n- 新增自定义处理方法worker\n- 支持自定义worker\n- 支持redis扩展及Predis扩展\n- 支持Timer定时器功能\n- 支持Crontab定时任务功能\n- 支持ThinkPHP5/6命令行使用\n- 支持THinkPHP3.2控制器CLI模式使用\n- 提供Controller trait便于其它框架启动worker\n- 提供MagicCall trait便于提交队列任务\n\n## 安装\n\n```bash\ncomposer require hectorqin/php-resque\n```\n\n## 配置\n\nTP5/6 默认获取 resque 配置文件, TP3.2 默认获取 RESQUE_CONFIG 配置\n\n```php\n\n\u003c?php\n\nuse Psr\\Log\\LogLevel;\nuse Resque\\Listener\\StatsListener;\nuse Resque\\WorkerManager;\n\nreturn [\n    // 是否守护进程\n    'daemonize'       =\u003e false,\n    // redis 数据库信息\n    'redis_backend'   =\u003e '',\n    // redis 数据库编号\n    'redis_database'  =\u003e '',\n    // worker消费间隔\n    'interval'        =\u003e 5,\n    // worker组\n    'worker_group'    =\u003e [\n        [\n            \"type\"  =\u003e \"Worker\",\n            \"queue\" =\u003e \"deault\",\n            \"nums\"  =\u003e 1,\n        ],\n        [\n            \"type\"  =\u003e \"SchedulerWorker\",\n            \"queue\" =\u003e \"default\",\n            \"nums\"  =\u003e 1,\n        ],\n        [\n            \"type\"     =\u003e \"CustomWorker\",\n            \"queue\"    =\u003e \"dump_date\",\n            'interval' =\u003e 5,\n            \"nums\"     =\u003e 2,\n            // 可使用闭包\n            \"handler\"  =\u003e function () {\n                WorkerManager::log(\"current datetime\" . date(\"Y-m-d H:i:s\"));\n            },\n        ],\n        [\n            \"type\"        =\u003e \"CrontabWorker\",\n            \"queue\"       =\u003e \"crontab\",\n            \"nums\"        =\u003e 2,\n            \"workerQueue\" =\u003e \"default\",\n        ],\n    ],\n\n    // 动态加载文件，使用 glob 函数\n    'app_include'     =\u003e '',\n\n    // redis存储前缀，默认为 resque\n    'prefix'          =\u003e '',\n\n    // manager pid文件\n    'pidfile'         =\u003e './resque.pid',\n\n    // 日志文件\n    'log_file'        =\u003e './resque.log',\n\n    // status临时文件\n    'statistics_file' =\u003e './resque.status',\n\n    // 是否不调用pcntl_fork，不调用时只支持一个workerGroup，且只有一个进程\n    'no_fork'         =\u003e false,\n\n    // 是否记录info日志\n    'verbose'         =\u003e false,\n    // 是否记录debug日志\n    'vverbose'        =\u003e false,\n    // 日志记录级别\n    'log_level'       =\u003e [\n        LogLevel::EMERGENCY,\n        LogLevel::ALERT,\n        LogLevel::CRITICAL,\n        LogLevel::ERROR,\n        LogLevel::WARNING,\n        LogLevel::NOTICE,\n        // LogLevel::INFO,\n    ],\n\n    // worker事件监听器\n    'listener' =\u003e [\n        StatsListener::class,\n    ],\n\n    // manager进程定时器 [\"interval\"=\u003e1, \"handler\"=\u003ecallable, \"params\"=\u003e[], \"persistent\"=\u003etrue]\n    // interval 时间间隔，handler 回调函数（可使用闭包），params 回调参数，persistent 是否周期性任务\n    'manager_timer' =\u003e [\n\n    ],\n\n    // worker 上的 秒级 crontab [\"name\"=\u003e'mycrontab',\"rule\"=\u003e\"0 * * * * *\",\"handler\"=\u003ecallable,\"params\"=\u003e[]]\n    // name 名称，rule 定时规则，handler 回调函数(不能使用闭包，闭包可以用opis/closure包装一下)，params 回调参数\n    // 必须启动 CrontabWorker 和 SchedulerWorker\n    'worker_crontab' =\u003e [\n\n    ],\n];\n```\n\n## 使用\n\n### 启动worker\n\n```bash\n# 测试\n./vendor/bin/resque\n\n# ThinkPHP使用\nphp think resque start\n# 守护进程\nphp think resque start -d\n```\n\n### 投递任务\n\n投递任务之前需要设置 ResqueRedis 的配置, `Resque::setBackend($redis_backend);`，TP5 / TP6 默认自动使用resque配置文件。TP3.2需要手动配置 `Resque::setBackend(C('RESQUE_CONFIG.redis_backend'));`。\n\n#### 简单任务\n\nhandler为任务执行函数\n\n```php\nuse Resque\\Job\\SimpleJob;\n\n// 投递到 default 队列\nSimpleJob::default([\n    'handler' =\u003e ['\\\\app\\\\index\\\\controller\\\\Index', 'job'],\n    'params'  =\u003e [\n        'hello' =\u003e 0\n    ], // ThinkPHP 支持参数绑定，其他框架请按照参数顺序传值\n], true);\n\n// 投递到 task 队列，延迟10秒执行\nSimpleJob::task([\n    'handler' =\u003e ['\\\\app\\\\index\\\\controller\\\\Index', 'job'],\n    'params'  =\u003e [\n        'hello' =\u003e 0\n    ], // ThinkPHP 支持参数绑定，其他框架请按照参数顺序传值\n], true, 10);\n\n// 投递到 task 队列，定时执行\nSimpleJob::task([\n    'handler' =\u003e ['\\\\app\\\\index\\\\controller\\\\Index', 'job'],\n    'params'  =\u003e [\n        'hello' =\u003e 0\n    ], // ThinkPHP 支持参数绑定，其他框架请按照参数顺序传值\n], true, strtotime(\"2020-12-01\"));\n```\n\n```php\n\u003c?php\nnamespace app\\index\\controller;\n\nclass Index\n{\n    function job($hello) {\n        echo $hello;\n    }\n}\n```\n\n#### 自定义任务\n\n编写自定义任务类，继承 SimpleJob，在 execute 方法内编写任务逻辑\n\n```php\nuse Resque\\Job\\SimpleJob;\nuse Resque\\Job;\n\n/**\n * 自定义任务\n * @property array $args 任务参数\n * @property Job $job 任务对象\n * @property string $queue 队列名称\n */\nclass MyJob extends SimpleJob\n{\n    /**\n     * 任务执行逻辑\n     *\n     * TP支持参数绑定，其余框架仅支持数组参数\n     *\n     * @return mixed\n     * @throws ThinkException\n     * @throws InvalidArgumentException\n     * @throws ClassNotFoundException\n     */\n    public function execute($hello)\n    {\n        // 自定义任务逻辑\n    }\n\n    /**\n     * 成功回调\n     *\n     * @return void\n     */\n    public function onSuccess()\n    {\n    }\n\n    /**\n     * 失败回调\n     * @return void\n     */\n    public function onError()\n    {\n    }\n}\n\n// 投递任务\nMyJob::enqueue([\n    'hello' =\u003e 1\n]);\n\n// 延迟3秒执行任务\nMyJob::enqueueAt([\n    'hello' =\u003e 1\n], 3);\n\n// 一个小时后执行任务\nMyJob::enqueueAt([\n    'hello' =\u003e 1\n], time() + 3600);\n\n(new MyJob())-\u003edelay(5)-\u003eexecuteAsync($param1, $param2);\n```\n\n### 监听事件\n\n```php\n// Worker、SchedulerWorker、CustomWorker、CrontabWorker 启动事件\nEvent::listen('onWorkerStart', [$this, 'onWorkerStart']);\n// Worker 创建job进程前事件\nEvent::listen('beforeForkExecutor', [$this, 'beforeForkExecutor']);\n// Worker 创建job进程后事件\nEvent::listen('afterForkExecutor', [$this, 'afterForkExecutor']);\n// 任务执行前事件\nEvent::listen('beforePerformJob', [$this, 'beforePerformJob']);\n// 任务执行后事件\nEvent::listen('afterPerformJob', [$this, 'afterPerformJob']);\n// 任务执行失败事件\nEvent::listen('onJobFailed', [$this, 'onJobFailed']);\n// Worker、SchedulerWorker、CustomWorker、CrontabWorker 关闭事件\nEvent::listen('onWorkerStop', [$this, 'onWorkerStop']);\n// 任务入队前事件\nEvent::listen('beforeEnqueue', [$this, 'beforeEnqueue']);\n// 任务入队后事件\nEvent::listen('afterEnqueue', [$this, 'afterEnqueue']);\n// 延迟/定时任务进入定时队列后事件\nEvent::listen('afterSchedule', [$this, 'afterSchedule']);\n// 延迟/定时任务进入执行队列前事件\nEvent::listen('beforeDelayedEnqueue', [$this, 'beforeDelayedEnqueue']);\n```\n\n### 快捷投递任务\n\n```php\nClass Test\n{\n    use \\Resque\\Concern\\MagicCall;\n\n    /**\n     * 任务执行 handler\n     */\n    function testResque($name)\n    {\n        trace('Hello ' . $name);\n    }\n\n    function test()\n    {\n        // 设置默认同步执行，不使用队列，可用于调试\n        // $this-\u003esetSync(true);\n        $this-\u003esetDefaultQueue('default');\n        // 任务 handler方法名 + Async 即可投递任务，参数顺序保持一致，方便调试\n        $this-\u003etestResqueAsync('hector');\n        $this-\u003edelay(5)-\u003etestResqueAsync('hector');\n        $this-\u003eat(time() + 10)-\u003etestResqueAsync('hector');\n        $this-\u003eat(time() + 15)-\u003ehandler([\\get_class(), 'testResque'], [\n            'hector'\n        ])-\u003esend();\n\n        // 同步执行,不使用队列,调试用\n        $this-\u003esync(true)-\u003etestResqueAsync('hector');\n    }\n}\n\n$test = new Test();\n$test-\u003etest();\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhectorqin%2Fphp-resque","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhectorqin%2Fphp-resque","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhectorqin%2Fphp-resque/lists"}