{"id":19756810,"url":"https://github.com/imiphp/imi-queue","last_synced_at":"2025-04-30T12:30:44.264Z","repository":{"id":52214606,"uuid":"275716589","full_name":"imiphp/imi-queue","owner":"imiphp","description":"imi 框架的队列组件，使用 Redis 作为持久化","archived":false,"fork":false,"pushed_at":"2024-08-10T00:12:17.000Z","size":319,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"2.0","last_synced_at":"2025-04-14T21:11:20.007Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":false,"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/imiphp.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,"roadmap":null,"authors":null}},"created_at":"2020-06-29T03:00:28.000Z","updated_at":"2024-12-16T03:17:18.000Z","dependencies_parsed_at":"2023-01-30T17:45:26.722Z","dependency_job_id":"daf4f4b8-88f4-4773-b33e-0a3f745d8cb5","html_url":"https://github.com/imiphp/imi-queue","commit_stats":{"total_commits":85,"total_committers":3,"mean_commits":"28.333333333333332","dds":0.07058823529411762,"last_synced_commit":"071b0b60b2dbfdffd648262b7bd427d1ae48bdec"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imiphp%2Fimi-queue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imiphp%2Fimi-queue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imiphp%2Fimi-queue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imiphp%2Fimi-queue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imiphp","download_url":"https://codeload.github.com/imiphp/imi-queue/tar.gz/refs/heads/2.0","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250878867,"owners_count":21501741,"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":[],"created_at":"2024-11-12T03:16:59.009Z","updated_at":"2025-04-30T12:30:43.877Z","avatar_url":"https://github.com/imiphp.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# imi-queue\n\n[![Latest Version](https://img.shields.io/packagist/v/imiphp/imi-queue.svg)](https://packagist.org/packages/imiphp/imi-queue)\n[![Php Version](https://img.shields.io/badge/php-%3E=7.4-brightgreen.svg)](https://secure.php.net/)\n[![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.7.0-brightgreen.svg)](https://github.com/swoole/swoole-src)\n[![IMI License](https://img.shields.io/github/license/imiphp/imi-queue.svg)](https://github.com/imiphp/imi-queue/blob/master/LICENSE)\n\n## 介绍\n\n[imi 框架](https://github.com/imiphp/imi)的队列组件，使用 Redis 作为持久化\n\n支持的特性：\n\n- 消息持久化\n- 分布式\n- 延时消息\n- ACK 机制\n- 消费超时机制\n- 失败/超时消息重新消费\n\n\u003e 本仓库仅用于浏览，不接受 issue 和 Pull Requests，请前往：\u003chttps://github.com/imiphp/imi\u003e\n\n## Composer\n\n本项目可以使用composer安装，遵循psr-4自动加载规则，在你的 `composer.json` 中加入下面的内容:\n\n```json\n{\n    \"require\": {\n        \"imiphp/imi-queue\": \"~2.0.0\"\n    }\n}\n```\n\n然后执行 `composer update` 安装。\n\n## 使用说明\n\n\u003e 可以参考 `example`、`tests` 目录示例。\n\n项目配置文件：\n\n```php\n[\n    'components'    =\u003e  [\n        'Queue'  =\u003e  'Imi\\Queue',\n    ],\n    'beans' =\u003e  [\n        'AutoRunProcessManager' =\u003e  [\n            'processes' =\u003e  [\n                // 加入队列消费进程，非必须，你也可以自己写进程消费\n                'QueueConsumer',\n            ],\n        ],\n        'imiQueue'  =\u003e  [\n            // 默认队列\n            'default'   =\u003e  'test1',\n            // 队列列表\n            'list'  =\u003e  [\n                // 队列名称\n                'test1' =\u003e  [\n                    // 使用的队列驱动\n                    'driver'        =\u003e  \\Imi\\Queue\\Driver\\RedisQueueDriver::class,\n                    // 消费协程数量\n                    'co'            =\u003e  1,\n                    // 消费进程数量；可能会受进程分组影响，以同一组中配置的最多进程数量为准\n                    'process'       =\u003e  1,\n                    // 消费循环尝试 pop 的时间间隔，单位：秒（仅使用消费者类时有效）\n                    'timespan'      =\u003e  0.1,\n                    // 进程分组名称\n                    'processGroup'  =\u003e  'a',\n                    // 自动消费\n                    'autoConsumer'  =\u003e  true,\n                    // 消费者类\n                    'consumer'      =\u003e  'AConsumer',\n                    // 驱动类所需要的参数数组\n                    'config'        =\u003e  [\n                        // redis 连接池名\n                        'poolName'  =\u003e  'redis',\n                        // redis 键前缀\n                        'prefix'    =\u003e  'imi:queue:test:',\n                        // 消费循环尝试 pop 的时间间隔，单位：秒（手动调用pop()方法有效）\n                        'timespan'  =\u003e  0.1,\n                    ]\n                ],\n            ],\n        ],\n    ]\n]\n```\n\n### 消费者类\n\n```php\n\u003c?php\nnamespace ImiApp\\Consumer;\n\nuse Imi\\Log\\Log;\nuse Imi\\Bean\\Annotation\\Bean;\nuse Imi\\Queue\\Contract\\IMessage;\nuse Imi\\Queue\\Driver\\IQueueDriver;\nuse Imi\\Queue\\Service\\BaseQueueConsumer;\n\n/**\n * @Bean(\"AConsumer\")\n */\nclass AConsumer extends BaseQueueConsumer\n{\n    /**\n     * 处理消费\n     * \n     * @param \\Imi\\Queue\\Contract\\IMessage $message\n     * @param \\Imi\\Queue\\Driver\\IQueueDriver $queue\n     * @return void\n     */\n    protected function consume(IMessage $message, IQueueDriver $queue)\n    {\n        Log::info(sprintf('[%s]%s:%s', $queue-\u003egetName(), $message-\u003egetMessageId(), $message-\u003egetMessage()));\n        $queue-\u003esuccess($message);\n    }\n\n}\n```\n\n### 获取队列对象\n\n```php\nuse \\Imi\\Queue\\Facade\\Queue;\n$queue = Queue::getQueue('队列名称');\n```\n\n### 推送消息到队列\n\n返回消息ID\n\n```php\n$message = new \\Imi\\Queue\\Model\\Message;\n$message-\u003esetMessage('字符串的消息内容');\n$message-\u003esetWorkingTimeout(0); // 设置工作超时时间，单位：秒，为0不限制\n$queue-\u003epush($message);\n// 延时消息，单位：秒\n$queue-\u003epush($message, 1.5);\n```\n\n### 从队列弹出一个消息\n\n```php\n$message = $queue-\u003epop();\nif(null !== $message)\n{\n    // 将消息标记为成功\n    $queue-\u003esuccess($message);\n\n    // 将消息标记为失败\n    $queue-\u003efail($message);\n\n    // 将消息标记为失败，并重回队列\n    $queue-\u003efail($message, true);\n}\n```\n\n### 删除消息\n\n```php\n$message = $queue-\u003epop();\nif(null !== $message)\n{\n    $queue-\u003edelete($message);\n}\n```\n\n### 清空队列\n\n```php\nuse \\Imi\\Queue\\Enum\\QueueType;\n\n$queue-\u003eclear(); // 清空全部\n\n// 清空指定类型\n$queue-\u003eclear([\n    QueueType::READY,   // 准备就绪\n    QueueType::WORKING, // 工作中\n    QueueType::FAIL,    // 失败\n    QueueType::TIMEOUT, // 超时\n    QueueType::DELAY,   // 准备就绪延时\n]);\n```\n\n### 获取队列状态\n\n```php\n// 返回 \\Imi\\Queue\\Model\\QueueStatus 类型\n$status = $queue-\u003estatus();\n$status-\u003egetReady();    // 准备就绪数量\n$status-\u003egetWorking();  // 工作中数量\n$status-\u003egetFail();     // 失败数量\n$status-\u003egetTimeout();  // 超时数量\n$status-\u003egetDelay();    // 延时数量\n```\n\n### 将失败消息恢复到队列\n\n让失败消息可以被重新消费\n\n```php\n$queue-\u003erestoreFailMessages();\n```\n\n### 将超时消息恢复到队列\n\n让超时消息可以被重新消费\n\n```php\n$queue-\u003erestoreTimeoutMessages();\n```\n\n## 命令行工具\n\n### 获取队列状态\n\n命令：`bin/imi-xxx queue/status 队列名称` (`xxx` 根据运行模式不同而不同)\n\n返回 JSON：\n\n```js\n{\n    \"ready\": 0,\n    \"working\": 0,\n    \"fail\": 0,\n    \"timeout\": 0,\n    \"delay\": 0\n}\n```\n\n### 将失败消息恢复到队列\n\n命令：`bin/imi-xxx queue/restoreFail 队列名称` (`xxx` 根据运行模式不同而不同)\n\n返回恢复的消息数量：\n\n```js\n0\n```\n\n### 将超时消息恢复到队列\n\n命令：`bin/imi-xxx queue/restoreTimeout 队列名称` (`xxx` 根据运行模式不同而不同)\n\n返回恢复的消息数量：\n\n```js\n0\n```\n\n## 免费技术支持\n\nQQ群：17916227 [![点击加群](https://pub.idqqimg.com/wpa/images/group.png \"点击加群\")](https://jq.qq.com/?_wv=1027\u0026k=5wXf4Zq)，如有问题会有人解答和修复。\n\n## 运行环境\n\n- [PHP](https://php.net/) \u003e= 7.4\n- [Composer](https://getcomposer.org/) \u003e= 2.0\n- [Swoole](https://www.swoole.com/) \u003e= 4.7.0\n\n## 版权信息\n\n`imi-queue` 遵循 MIT 开源协议发布，并提供免费使用。\n\n## 捐赠\n\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/imiphp/imi@2.0/res/pay.png\"/\u003e\n\n开源不求盈利，多少都是心意，生活不易，随缘随缘……\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimiphp%2Fimi-queue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimiphp%2Fimi-queue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimiphp%2Fimi-queue/lists"}