{"id":19411470,"url":"https://github.com/volcengine/ve-rocketmq-php-sdk","last_synced_at":"2026-05-12T20:31:35.136Z","repository":{"id":149367388,"uuid":"613741039","full_name":"volcengine/ve-rocketmq-php-sdk","owner":"volcengine","description":"Volcengine RocketMQ HTTP-Proxy PHP SDK.","archived":false,"fork":false,"pushed_at":"2023-08-29T08:50:38.000Z","size":33,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-08T04:35:05.404Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/volcengine.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}},"created_at":"2023-03-14T07:15:29.000Z","updated_at":"2024-12-02T02:43:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"8333a7bd-48f4-4410-982e-aaff1ef716f7","html_url":"https://github.com/volcengine/ve-rocketmq-php-sdk","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volcengine%2Fve-rocketmq-php-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volcengine%2Fve-rocketmq-php-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volcengine%2Fve-rocketmq-php-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volcengine%2Fve-rocketmq-php-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/volcengine","download_url":"https://codeload.github.com/volcengine/ve-rocketmq-php-sdk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240589028,"owners_count":19825284,"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-10T12:21:33.585Z","updated_at":"2026-05-12T20:31:30.110Z","avatar_url":"https://github.com/volcengine.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RocketMQ PHP SDK\n\n火山引擎消息队列 RocketMQ版PHP SDK 是基于 HTTP-Proxy 的RocketMQ客户端。 该SDK可通过RocketMQ实例的Http Proxy 接入点连接实例，实现消息的生产与消费。\n\n# 安装\n\n\n```shell\ncomposer require volcengine/ve-rocketmq-php-sdk\n```\n\n# 快速开始\n\n## 创建客户端。\n\n初始化一个RocketMQ客户端需要准备好火山引擎RocketMQ实例的HTTP Proxy接入点、accessKey和secretKey。\n\n```php\nuse RMQ\\Client;\n\n//  HTTP Proxy 接入点\n$endpoint = \"\"; \n// 密钥\n$accessKey = \"\"; \n$secretKey = \"\";\n\n// 实例化客户端\n$client = new Client($endpoint, $accessKey, $secretKey);\n```\n\n## 生产\n\n### 创建生产者\n\n调用client实例的 `createProducer()` 方法即可创建一个生产者实例。\n\n```php\n// 创建一个生产者\n$producer = $client-\u003ecreateProducer();\n```\n\n### 创建消息\n\n一条消息拥有很多属性topic、body、tag、key等，可以使用 `Message` 实例化一个消息的信息对象并可在这个对象上设置这些属性。\n\n```php\nuse RMQ\\Message;\n\n// 目标topic\n$topic =\"topic_name\"; \n// 消息的内容\n$messageContent = \"content.\" \n\n// 实例化一个消息\n$msg = new Message($topic, $messageContent);\n// 设置消息的tag值\n$msg-\u003esetTag(\"tag_a\");\n// 设置ShardingKey\n$msg-\u003esetShardingKey(\"my_key\");\n// 设置自定义属性\n$msg-\u003eputProperty(\"property_name\", \"test\");\n```\n\n### 生产消息\n\n调用producer实例的 `publishMessage()` 方法就能发布一条消息。在发布消息前还需要调用 `open()` 方法在服务端开启一个生产者实例， 在不需要发送消息时可以调用 `close()` 方法销毁。\n\n```php\n$producer-\u003eopen();\n\n$msg = new Message(\"topic_name\", \"hello!\");\n$messageInfo = $producer-\u003epublishMessage($msg);\n$producer-\u003eclose();\n\nvar_dump(messageInfo);\n```\n## 消费\n\n### 创建消费者\n\n调用client实例的 `createConsumer()` 方法即可创建一个消费者实例, 创建消费者时必须指定消费者的GroupID。\n\n```php\n$groupID = \"\"; // 消费组ID\n \n$consumer = $client-\u003ecreateConsumer($groupID, [\n  // 每次调用consumeMessage最多拉取12条消息\n  \"max_message_number\" =\u003e 12,\n  // 在消息达到max_message_number之前，请求在服务端挂起的最大等待时长（单位ms）\n  \"max_wait_time\"      =\u003e 3000\n]);\n```\n\n### 消费消息\n\n调用消费者的 `consumeMessage()` 能拉取一批消息。在拉取消息并被使用后，需要调用 `ackMessages()` 对消息的消费状态进行确认，未被确认或确认消费失败的消息都会被重复消费。\n\n```php\nuse RMQ\\Model\\MessageInfo;\n\n$consumer = $client-\u003ecreateConsumer($groupID);\n// 订阅topic_a 全部消息1\n$consumer-\u003esubscribe(\"topic_a\");\n// 订阅topic_b tag为A的消息\n$consumer-\u003esubscribe(\"topic_b\", \"A\");\n\n$consumer-\u003eopen();\n\n// 拉取消息\n$messages = $consumer-\u003econsumeMessage();\n\n$acksHandles = [];\nforeach ($messages as $msg) {\n    $body = $msg-\u003ebody;\n    echo \"message bode: $body \\n\";\n    array_push($acksHandles, $msg-\u003emsgHandle);\n}\n// 确认消息的消费情况\n// ackMessages第一个参数是确认消费成功的消息的msgHandle\n// ackMessages第二个参数是确认消费失败的消息的msgHandle\n$consumer-\u003eackMessages($acksHandles, []);\n\n$consumer-\u003eclose();\n```\n\n# 进阶指引\n\n## 持续生产消息\n\n服务端会对每一个客户端创建一个生产者实例，在客户端生产频率较低时，可能会出现服务端生产者实例被释放导致生产消息失败的情况。\n\n```php\n$producer-\u003eopen();\n// 在open后等待60秒\nsleep(60);\n// 下面的方法调用会失败，因为服务端的生产者实例已超时被销毁掉\n$producer-\u003epublishMessage($msg);\n```\n\n所以在持续生产消息时需要捕获这类异常并重新调用 `open()` 方法重新在服务端开启一个生产者实例，SDK 提供了一个专门用来捕获该类错误的Exception在`RMQ\\Exception\\MQTokenTimeoutException` 。如下demo，对部分消息等待一个很长的时间，这些消息发送时就会捕获到超时错误。\n\n```php\nuse RMQ\\Exception\\MQTokenTimeoutException;\n\nfor ($i = 0; $i \u003c 10; $i++) {\n  if ($i % 2 == 0) {\n    sleep(60 * 10); // 偶数消息等待10分钟\n  }\n  \n  $message = new Message(\"topic_name\", \"hello!\");\n  try {\n    // 发送消息\n    $producer-\u003epublishMessage($message);\n  } catch (MQTokenTimeoutException $e) {\n    // token失效的情况需要重连\n    $producer-\u003eopen();\n    // 对消息重发\n    $producer-\u003epublishMessage($message);\n  } catch (RuntimeException $e) {\n    // 其他错误情况\n    echo $e . \"\\n\";\n  }\n}\n```\n\n## 持续消费消息\n\n持续消息实际上就是一个轮询不断拉取消息，如果每次拉取消息的间隔过长也可能出现超时的情况，所以也需要捕获超时错误并重新调用 `open()` 方法。\n\n```php\n$consumer-\u003eopen();\n\nwhile (true) {\n  try {\n    // 拉取消息\n    $messages    = $consumer-\u003econsumeMessage();\n    $acksHandles = [];\n    foreach ($messages as $msg) {\n        $body = $msg-\u003ebody;\n        echo \"message bode: $body \\n\";\n        array_push($acksHandles, $msg-\u003emsgHandle);\n    }\n    // 确认消费状态\n    $consumer-\u003eackMessages($acksHandles, []);\n  } catch (MQTokenTimeoutException $e) {\n    // token失效的情况需要重连\n    $consumer-\u003eopen();\n  } catch (RuntimeException $e) {\n    // 其他错误 \n    echo $e;\n  }\n}\n```\n\n## 延时消息\n\n延时是消息的一个属性，可通过`Message`类的`putProperty()`方法来设置消息的延时属性。\n\n### 定时投递消息\n\n通过指定的具体的毫秒时间戳定时投递消息。\n\n```php\nuse RMQ\\Message;\n\n$msg = new Message(\"topic_name\", \"content.\");\n// 消息投递的具体毫秒时间戳（当前时间延迟30秒）\n$postTime = time() * 1000 + 30000; \n// 将延时属性设置到Property中\n$msg-\u003eputProperty(\"__STARTDELIVERTIME\", \"$currentTimeStamp\"); \n```\n\n### 延时等级消息\n\n`Message` 类有 `setDelayLevel()` 方法可设置消息的延时属性。可设置1-18等级.\n\n```php\n$msg2 = new Message(\"topic_name\", \"content\");\n\n$msg2-\u003esetDelayLevel(5)\n```\n\n`setDelayLevel()` 方法背后实际上使用的还是`putProperty()`方法。使用`setDelayLevel()` 实际效果和下面一致。\n\n```php\n$level = 5\n\n$msg2 = new Message(\"topic_name\", \"content\");\n\n$msg2-\u003eputProperty(\"__DelayTimeLevel\", \"$level\");\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvolcengine%2Fve-rocketmq-php-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvolcengine%2Fve-rocketmq-php-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvolcengine%2Fve-rocketmq-php-sdk/lists"}