{"id":19621582,"url":"https://github.com/pkg6/think-queue","last_synced_at":"2025-04-28T03:32:19.918Z","repository":{"id":144711026,"uuid":"318830872","full_name":"pkg6/think-queue","owner":"pkg6","description":null,"archived":true,"fork":false,"pushed_at":"2023-08-27T07:49:51.000Z","size":371,"stargazers_count":7,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-24T03:19:37.521Z","etag":null,"topics":["queue"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pkg6.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,"governance":null}},"created_at":"2020-12-05T16:09:36.000Z","updated_at":"2024-10-21T03:27:47.000Z","dependencies_parsed_at":"2023-09-03T09:15:59.857Z","dependency_job_id":null,"html_url":"https://github.com/pkg6/think-queue","commit_stats":null,"previous_names":["zzqqw/think-queue","pkg6/think-queue"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkg6%2Fthink-queue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkg6%2Fthink-queue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkg6%2Fthink-queue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkg6%2Fthink-queue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pkg6","download_url":"https://codeload.github.com/pkg6/think-queue/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251246280,"owners_count":21558762,"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":["queue"],"created_at":"2024-11-11T11:23:37.804Z","updated_at":"2025-04-28T03:32:19.021Z","avatar_url":"https://github.com/pkg6.png","language":"PHP","readme":"# think-queue\n\n\n\n## 安装\n\u003e composer require topthink/think-queue\n\n## 配置\n\u003e 配置文件位于 `application/extra/queue.php`\n### 公共配置\n\n```\n[\n    'connector'=\u003e'sync' //驱动类型，可选择 sync(默认):同步执行，database:数据库驱动,redis:Redis驱动,topthink:Topthink驱动\n                   //或其他自定义的完整的类名\n]\n```\n\n### 驱动配置\n\u003e 各个驱动的具体可用配置项在`think\\queue\\connector`目录下各个驱动类里的`options`属性中，写在上面的`queue`配置里即可覆盖\n\n\n## 使用 Database\n\u003e 创建如下数据表\n\n```\nCREATE TABLE `prefix_jobs` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `queue` varchar(255) NOT NULL,\n  `payload` longtext NOT NULL,\n  `attempts` tinyint(3) unsigned NOT NULL,\n  `reserved` tinyint(3) unsigned NOT NULL,\n  `reserved_at` int(10) unsigned DEFAULT NULL,\n  `available_at` int(10) unsigned NOT NULL,\n  `created_at` int(10) unsigned NOT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n```\n\n## 创建任务类\n\u003e 单模块项目推荐使用 `app\\job` 作为任务类的命名空间\n\u003e 多模块项目可用使用 `app\\module\\job` 作为任务类的命名空间\n\u003e 也可以放在任意可以自动加载到的地方\n\n任务类不需继承任何类，如果这个类只有一个任务，那么就只需要提供一个`fire`方法就可以了，如果有多个小任务，就写多个方法，下面发布任务的时候会有区别  \n每个方法会传入两个参数 `think\\queue\\Job $job`（当前的任务对象） 和 `$data`（发布任务时自定义的数据）\n\n还有个可选的任务失败执行的方法 `failed` 传入的参数为`$data`（发布任务时自定义的数据）\n\n### 下面写两个例子\n\n```\nnamespace app\\job;\n\nuse think\\queue\\Job;\n\nclass Job1{\n    \n    public function fire(Job $job, $data){\n    \n            //....这里执行具体的任务 \n            \n             if ($job-\u003eattempts() \u003e 3) {\n                  //通过这个方法可以检查这个任务已经重试了几次了\n             }\n            \n            \n            //如果任务执行成功后 记得删除任务，不然这个任务会重复执行，直到达到最大重试次数后失败后，执行failed方法\n            $job-\u003edelete();\n            \n            // 也可以重新发布这个任务\n            $job-\u003erelease($delay); //$delay为延迟时间\n          \n    }\n    \n    public function failed($data){\n    \n        // ...任务达到最大重试次数后，失败了\n    }\n\n}\n\n```\n\n```\n\nnamespace app\\lib\\job;\n\nuse think\\queue\\Job;\n\nclass Job2{\n    \n    public function task1(Job $job, $data){\n    \n          \n    }\n    \n    public function task2(Job $job, $data){\n    \n          \n    }\n    \n    public function failed($data){\n    \n          \n    }\n\n}\n\n```\n\n\n## 发布任务\n\u003e `think\\Queue::push($job, $data = '', $queue = null)` 和 `think\\Queue::later($delay, $job, $data = '', $queue = null)` 两个方法，前者是立即执行，后者是在`$delay`秒后执行\n\n`$job` 是任务名  \n单模块的，且命名空间是`app\\job`的，比如上面的例子一,写`Job1`类名即可  \n多模块的，且命名空间是`app\\module\\job`的，写`model/Job1`即可  \n其他的需要些完整的类名，比如上面的例子二，需要写完整的类名`app\\lib\\job\\Job2`  \n如果一个任务类里有多个小任务的话，如上面的例子二，需要用@+方法名`app\\lib\\job\\Job2@task1`、`app\\lib\\job\\Job2@task2`\n\n`$data` 是你要传到任务里的参数\n\n`$queue` 队列名，指定这个任务是在哪个队列上执行，同下面监控队列的时候指定的队列名,可不填\n\n## 监听任务并执行\n\n\u003e php think queue:listen\n\n\u003e php think queue:work --daemon（不加--daemon为执行单个任务）\n\n两种，具体的可选参数可以输入命令加 --help 查看\n\n\u003e可配合supervisor使用，保证进程常驻\n\n\n# QQ交流\n\n[1751212020](http://wpa.qq.com/msgrd?v=3\u0026uin=1751212020\u0026site=qq\u0026menu=yes)\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpkg6%2Fthink-queue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpkg6%2Fthink-queue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpkg6%2Fthink-queue/lists"}