{"id":19829649,"url":"https://github.com/workbunny/webman-rabbitmq","last_synced_at":"2026-03-09T11:06:43.165Z","repository":{"id":37714073,"uuid":"506138250","full_name":"workbunny/webman-rabbitmq","owner":"workbunny","description":"🚀🐇 A PHP implementation of RabbitMQ Client for webman plugin. ","archived":false,"fork":false,"pushed_at":"2026-01-21T16:07:50.000Z","size":159,"stargazers_count":30,"open_issues_count":3,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-22T00:02:38.864Z","etag":null,"topics":["plugin","rabbitmq","webman","workbunny","workerman"],"latest_commit_sha":null,"homepage":"https://www.workerman.net/plugin/67","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/workbunny.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,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-06-22T07:14:51.000Z","updated_at":"2026-01-21T12:08:45.000Z","dependencies_parsed_at":"2023-12-25T07:22:12.790Z","dependency_job_id":"56e67870-564a-439e-a2c2-3b3df806ecbc","html_url":"https://github.com/workbunny/webman-rabbitmq","commit_stats":{"total_commits":48,"total_committers":1,"mean_commits":48.0,"dds":0.0,"last_synced_commit":"bba5af74acf946067be29d94068752583467edf7"},"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/workbunny/webman-rabbitmq","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workbunny%2Fwebman-rabbitmq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workbunny%2Fwebman-rabbitmq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workbunny%2Fwebman-rabbitmq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workbunny%2Fwebman-rabbitmq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/workbunny","download_url":"https://codeload.github.com/workbunny/webman-rabbitmq/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workbunny%2Fwebman-rabbitmq/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28755563,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T16:32:25.380Z","status":"ssl_error","status_checked_at":"2026-01-25T16:32:09.189Z","response_time":113,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["plugin","rabbitmq","webman","workbunny","workerman"],"created_at":"2024-11-12T11:19:28.886Z","updated_at":"2026-03-09T11:06:43.144Z","avatar_url":"https://github.com/workbunny.png","language":"PHP","readme":"\u003cp align=\"center\"\u003e\u003cimg width=\"260px\" src=\"https://chaz6chez.cn/images/workbunny-logo.png\" alt=\"workbunny\"\u003e\u003c/p\u003e\n\n**\u003cp align=\"center\"\u003eworkbunny/webman-rabbitmq\u003c/p\u003e**\n\n**\u003cp align=\"center\"\u003e🐇 A pure-PHP implementation of AMQP for webman/workerman. 🐇\u003c/p\u003e**\n\n# A pure-PHP implementation of AMQP for webman/workerman. \n\n\n[![Latest Stable Version](https://badgen.net/packagist/v/workbunny/webman-rabbitmq/latest)](https://packagist.org/packages/workbunny/webman-rabbitmq) [![Total Downloads](https://badgen.net/packagist/dt/workbunny/webman-rabbitmq)](https://packagist.org/packages/workbunny/webman-rabbitmq) [![License](https://badgen.net/packagist/license/workbunny/webman-rabbitmq)](https://packagist.org/packages/workbunny/webman-rabbitmq) [![PHP Version Require](https://badgen.net/packagist/php/workbunny/webman-rabbitmq)](https://packagist.org/packages/workbunny/webman-rabbitmq)\n\n### 说明\n\n- 此文档为3.0\n- 2.0 LTS [2.0文档](https://github.com/workbunny/webman-rabbitmq/blob/2.x/README.md)\n\n## 简介\n\n适配`Workerman`/`webman`的`AMQP`组件包\n\n- 支持基于`AMQP`协议工具实现`AMQP-Server`\n- 支持5种消费模式：简单队列、workQueue、routing、pub/sub、exchange；\n- 支持延迟队列（rabbitMQ须安装插件）；\n- 支持连接池，支持通道池，`Builder`支持影子模式（并发补偿）；\n- 3.0与之前版本相比，更符合`AMQO`协议约定，更合理的架构设计和使用逻辑\n  \t- 使用`ConnectionManagement`多连接管理器管理`Connection`（`Client`），合理复用机制及并发使用能力\n  \t- 使用`Channel-Pool`管理`Channel`，合理的复用和并发机制\n  \t- 提供`AMQP`协议包，可供开发者自定义实现`AMQP-Client`或`AMQP-Server`，并提供`AMQP-Frame`协议帧工具\n \n### 概念\n\n```\n    ┌───────────┐                              \n    | Builder A | ──┐          \n    └───────────┘   |                                          | ┌───────────┐\n                    |                                          | | Channel 1 |\n                    |                                          | └───────────┘\n    ┌───────────┐   └─\u003e ┌──────────────────┐                   | ┌───────────┐\n    | Builder A | ────\u003e | Connections Pool | ── connection ──\u003e | | Channel 2 |\n    └───────────┘   ┌─\u003e └──────────────────┘   min ... MAX     | └───────────┘\n                    |         \u003cstatic\u003e          \u003ccontext\u003e      | ┌───────────┐\n                    |                                          | | Channel 3 |\n    ┌───────────┐   |                                          | └───────────┘\n    | Builder C | ──┘                                                 ...\n    └───────────┘                                                 channel-max\n\n```\n- `Builder`：队列消费者、生产者的抽象结构，类似`ORM`的`Model`\n  - `BuilderConfig`: 队列配置结构\n  - `Builder`可以指定不同的`connection`配置进行连接，以区分业务/服务\n  - `Builder`的`publish`/`consume`使用了影子模式（当前`Connection`的`Channel`耗尽时，会自动从`Connection Pool`获取新的连接创建`Channel`）\n      - 影子模式下请尽量将`Connection Pool`和`Channels Pool`的配置`wait_timeout`改小，避免过长时间的等待（等待中会出让控制权，不会阻塞）\n- `Connection`：基于`AsyncTcpConnection`封装的`AMQP-client`\n  - `Connection`由`ConnectionManagement`管理，连接池为静态，不会因为`Builder`的释放而释放\n  - `Connection Pool`中通过`get`拿取`Connection`后需要手动调用`release`归还，或者使用`action`通过传入回调函数来执行并自动归还\n  - 配置信息：\n    - `min_connections`: 最小连接数\n    - `max_connections`: 最大连接数\n    - `idel_timeout`: 空闲回收时间 [s]\n    - `wait_timeout`: 等待连接超时时间 [s]\n- `Channel`：抽象的通道对象\n  - 每一个`Connection`都具备一个`Channel`池\n    - 多协程时，自动创建新的`Channel`消费，并在协程结束后自动归还/释放\n    - 单协程时，复用`Channel`消费\n  - 配置信息：\n    - `idel_timeout`: 空闲回收时间 [s]\n    - `wait_timeout`: 等待连接超时时间 [s]\n- `AMQP`: `workerman`支持的协议封装\n\n**[详细文档](https://workbunny.github.io/webman-rabbitmq/)**\n\n## 使用\n\n### 要求\n- php \u003e= 8.1\n- webman-framework \u003e= 2.0 或 workerman \u003e= 5.1\n- rabbitmq-server \u003e= 3.10\n\n### 安装\n\n```\ncomposer require workbunny/webman-rabbitmq\n```\n\n### 配置\n\n#### **基础配置** `app.php`\n\n```php\n\u003c?php declare(strict_types=1);\n\nreturn [\n    'enable' =\u003e true,\n    // 日志 LoggerInterface | LoggerInterface::class\n    'logger'   =\u003e null,\n];\n```\n\n#### **连接配置** `connections.php`\n\n```php\n\u003c?php declare(strict_types=1);\n\nuse Workbunny\\WebmanRabbitMQ\\Clients\\AbstractClient;\nuse Workbunny\\WebmanRabbitMQ\\Connections\\Connection;\n\nreturn [\n    'default' =\u003e [\n        'connection'       =\u003e Connection::class,\n        // 连接池\n        'connections_pool' =\u003e [\n            'min_connections'       =\u003e 1,\n            'max_connections'       =\u003e 20,\n            'idle_timeout'          =\u003e 60,\n            'wait_timeout'          =\u003e 10\n        ],\n        'config' =\u003e [\n            'host'               =\u003e 'rabbitmq',\n            'vhost'              =\u003e '/',\n            'port'               =\u003e 5672,\n            'username'           =\u003e 'guest',\n            'password'           =\u003e 'guest',\n            'mechanism'          =\u003e 'AMQPLAIN',\n            'timeout'            =\u003e 10,\n            // 重启间隔\n            'restart_interval'   =\u003e 5,\n            // 通道池\n            'channels_pool'      =\u003e [\n                'idle_timeout'     =\u003e 60,\n                'wait_timeout'     =\u003e 10\n            ],\n            'client_properties' =\u003e [\n                'name'     =\u003e 'workbunny/webman-rabbitmq',\n                'version'  =\u003e \\Composer\\InstalledVersions::getVersion('workbunny/webman-rabbitmq')\n            ],\n            // 心跳回调 callable\n            'heartbeat_callback' =\u003e null,\n        ]\n    ]\n];\n```\n\n### 命令行\n\n- 构建：`php webman workbunny:rabbitmq-builder -h`\n- 移除/关闭：`php webman workbunny:rabbitmq-remove -h`\n- 列表：`php webman workbunny:rabbitmq-list -h`\n\n### 延迟队列\n\n**延迟队列需要为 rabbitMQ 安装 rabbitmq_delayed_message_exchange 插件**\n\n1. 进入 rabbitMQ 的 plugins 目录下执行命令下载插件（以rabbitMQ 3.10.2举例）：\n   ```shell\n   wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.10.2/rabbitmq_delayed_message_exchange-3.10.2.ez\n   ```\n2. 执行安装命令\n   ```shell\n   rabbitmq-plugins enable rabbitmq_delayed_message_exchange\n   ```\n3. 生产\n   ```PHP\n   publish(new TestBuilder(), 'abc', headers: [\n       'x-delay' =\u003e 10000, # 延迟10秒\n   ]); # return bool\n   ```\n   **注：向延迟队列发布普通消息会抛出一个 WebmanRabbitMQException 异常**\n\n#### 注意\n\n- 不少第三方厂商不支持安装延迟队列插件\n- 当不支持安装延迟队列时，可以通过优先级队列 + `REQUEUE`实现\n  - `Builder`支持通过`REQUEUE`标记进行消息重入队尾\n  - 通过自定义`header`中的时间标记，和逻辑判断，当满足时间条件时则执行，不满足条件则通过`REQUEUE`将数据自动推回队尾\n  - 为了减少数据延迟问题，使用优先级标识将时间较近的消息优先级定义高一些，而时间较长的数据优先级定义低一些\n    - 队列通常支持`0-9`的优先级，合理分配时间段和优先级的匹配关系\n### 生产\n\n**注：向延迟队列发布普通消息会抛出一个 WebmanRabbitMQPublishException 异常**\n\n**注：首先使用命令行工具或者手动创建对应的`Builder`，以下以`Workbunny\\Tests\\TestBuilders\\TestPublishBuilder`举例**\n\n- 快捷发送\n    ```php\n    use function Workbunny\\WebmanRabbitMQ\\publish;\n    use Workbunny\\Tests\\TestBuilders\\TestPublishBuilder;\n    \n    publish(new TestPublishBuilder(), 'abc'); # return bool\n    ```\n\n- `Builder`发送\n    ```php\n    use Workbunny\\Tests\\TestBuilders\\TestPublishBuilder;\n    use Workbunny\\WebmanRabbitMQ\\BuilderConfig;\n    use Workbunny\\WebmanRabbitMQ\\Connection\\ConnectionInterface;\n    $builder = new TestPublishBuilder();\n    $body = 'abc';\n    return $builder-\u003eaction(function (ConnectionInterface $connection) use ($builder, $body) {\n        $config = new BuilderConfig($builder-\u003egetBuilderConfig()());\n        $config-\u003esetBody($body);\n        $builder-\u003epublish($connection, $config);\n    });\n    ```\n  \n- 原生发送，需要自行指定`exchange`等参数\n    ```php\n    use Workbunny\\WebmanRabbitMQ\\BuilderConfig;\n    use Workbunny\\WebmanRabbitMQ\\Connection\\ConnectionInterface;\n    use Workbunny\\WebmanRabbitMQ\\ConnectionsManagement;\n    $config = new \\Workbunny\\WebmanRabbitMQ\\BuilderConfig();\n    $config-\u003esetExchange('your_exchange');\n    $config-\u003esetRoutingKey('your_routing_key');\n    $config-\u003esetQueue('your_queue');\n    $config-\u003esetBody('abc');\n    $config-\u003esetMandatory(true);\n    $config-\u003esetImmediate(false);\n    // 使用 your_connection 配置连接发送\n    return ConnectionsManagement::connection(function (ConnectionInterface $connection) use ($config) {\n        $connection-\u003echannel()-\u003epublish(\n            $config-\u003egetBody(),\n            $config-\u003egetHeaders(),\n            $config-\u003egetExchange(),\n            $config-\u003egetRoutingKey(),\n            $config-\u003egetMandatory(),\n            $config-\u003egetImmediate()\n        );\n    }, 'your_connection');\n    ```\n\n### 消费\n\n**注：首先使用命令行工具或者手动创建对应的`Builder`，以下以`Workbunny\\Tests\\TestBuilders\\TestConsumeBuilder`举例**\n\n- 快捷消费\n    - 修改生成的`Builder`文件，将`handler()`方法逻辑添加消费逻辑\n    - 启动构建好的`Builder`自定义进程即是启动消费\n\n- `Builder`消费\n    ```php\n    use Workbunny\\Tests\\TestBuilders\\TestConsumeBuilder;\n    use Workbunny\\WebmanRabbitMQ\\Connection\\ConnectionInterface;\n    $builder = new TestConsumeBuilder();\n    $builder-\u003eaction(function (ConnectionInterface $connection) use ($builder) {\n        $builder-\u003econsume($connection, $builder-\u003egetBuilderConfig());\n    });\n    ```\n    **注：需要保持该进程常驻**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkbunny%2Fwebman-rabbitmq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fworkbunny%2Fwebman-rabbitmq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkbunny%2Fwebman-rabbitmq/lists"}