开源技术小栈开源技术小栈
🌐 Home
⛄ 精选文章
🐜 数据库
Ⓜ️ 微服务
📺 Bilibili
🐳 Github
🎃 腾讯云社区
💫 博客园
  • 💫 Git
  • 🐜 Linux
  • 🕸️ Docker
  • 🐌 Jenkins
🌐 Home
⛄ 精选文章
🐜 数据库
Ⓜ️ 微服务
📺 Bilibili
🐳 Github
🎃 腾讯云社区
💫 博客园
  • 💫 Git
  • 🐜 Linux
  • 🕸️ Docker
  • 🐌 Jenkins
  • 0X01 2025

    • 🔶 大模型编程0X01 | 调用 API 完成内容分类
    • 🔶 PHP8.5 新增管道操作符
    • 🔶 Redis搭建高并发电商秒杀系统
    • 🔶 MQTT与PHP使用实时消息传递指南
    • 🔶 MQTT消息协议初学者指南
  • 0X01 2024

    • 🔷 SaaS多租户架构数据源动态切换解决方案
    • 🔶 HTTP分块Chunk传输让客户端响应更迅速数据
    • 🔷 PHP使用JSONSchema进行API模式验证和类型检查
    • 🔶 PHP日志管理神器Monolog
    • 🔷 使用PHP创建和管理自己的JWT令牌
    • 🔶 谁说PHP不能异步和并行运行?
    • 🔷 webman使用RabbitMQ消息中间件实现系统异步解耦实战教程
    • 🔶 基于Websocket和Canvas实现多人协作实时共享白板
    • 🔶 PHP高性能纯协程网络通信引擎Swow
    • 🔶 webman如何使用swoole事件驱动和协程?
    • 🔶 高性能PHP框架webman协程插件入门实战
    • 🔶 编译PHP 8.3并快速启动ThinkPHP 8.0框架项目
    • 🔶 【转载】漫谈Swoole协程与异步IO

MQTT 发布/订阅过程

为 PHP 选择最佳 MQTT 客户端库

在本教程中,我们将使用 php-mqtt/client 库,它在 Composer 上的下载量最高。它是一种可靠、易于使用的解决方案,用于将 MQTT 集成到 PHP 应用程序中。如果您正在寻找其他用于 PHP 的 MQTT 客户端库,您可以在 Packagist 上探索更多选项。

MQTT 通信属于 HTTP 系统之外的网络通信场景。由于 PHP 特性的限制,在 PHP 系统中使用 Swoole/Workerman 等网络通信扩展可以带来更好的体验。本文将不再重复其使用。相关的 MQTT 客户端库如下:

  • workerman/mqtt:基于 workerman 的 PHP 异步 MQTT 客户端。
  • simps/mqtt:MQTT 协议 PHP 的分析和协程客户端。

设置 PHP 项目以进行 MQTT 集成

确认 PHP 版本

首先,请确保您使用的是 PHP 7.4.21 或更高版本。您可以通过在终端中运行以下命令来检查您的 PHP 版本:

php --version

PHP 7.4.21 (cli) (built: Jul 12 2021 11:52:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.21, Copyright (c), by Zend Technologies

使用 Composer 安装

Composer 是一款功能强大的 PHP 依赖管理工具,可简化 PHP 项目所需库的安装。

要安装 php-mqtt/client 库,请在项目根目录中运行以下命令:

composer require php-mqtt/client

这将下载并安装 php-mqtt/client 库及其所有依赖项。安装完成后,您可以在 PHP 代码中使用该库。

PHP MQTT 用法

连接到 MQTT 代理

本文将使用 EMQX 提供的免费公共 MQTT 代理 ,该代理是在 EMQX MQTT 平台上创建的。服务器访问信息如下:

  • Broker:broker.emqx.io
  • TCP 端口:1883
  • SSL/TLS 端口:8883

导入自动加载文件

在 PHP 代码中使用 php-mqtt/client 库之前,您需要导入 Composer 的自动加载文件。请在您的 PHP 脚本中添加以下代码:

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;

设置 MQTT Broker 连接参数

设置 MQTT Broker 连接地址、端口和主题。同时,我们调用 PHP rand 函数随机生成 MQTT 客户端 ID。

$server   = 'broker.emqx.io';
$port     = 1883;
$clientId = rand(5, 15);
$username = 'emqx_user';
$password = 'public';
$clean_session = false;
$mqtt_version = MqttClient::MQTT_3_1_1;

编写 MQTT 连接函数

使用上述参数进行连接,并通过 ConnectionSettings 设置连接参数,例如:

$connectionSettings = (new ConnectionSettings)
  ->setUsername($username)
  ->setPassword($password)
  ->setKeepAliveInterval(60)
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);

订阅

程序订阅 emqx/test 的 topic,并为订阅配置回调函数来处理接收到的消息。在这里,我们打印出从订阅中获得的主题和消息:

$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

发布

构造一个有效负载并调用 publish 函数将消息发布到 emqx/test 主题。发布后,客户端需要进入轮询状态来处理传入的消息和重传队列:

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => 'https://github.com/emqx/MQTT-Client-Examples'
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

// The client loop to process incoming messages and retransmission queues
$mqtt->loop(true);

完整代码

以下是连接、发布和订阅 MQTT 代理的完整 PHP 代码:

pubsub_tcp.php

<?php

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;
use \PhpMqtt\Client\ConnectionSettings;

$server   = 'broker.emqx.io';
$port     = 1883;
$clientId = rand(5, 15);
$username = 'emqx_user';
$password = 'public';
$clean_session = false;
$mqtt_version = MqttClient::MQTT_3_1_1;

$connectionSettings = (new ConnectionSettings)
  ->setUsername($username)
  ->setPassword($password)
  ->setKeepAliveInterval(60)
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);


$mqtt = new MqttClient($server, $port, $clientId, $mqtt_version);

$mqtt->connect($connectionSettings, $clean_session);
printf("client connected\n");

$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => 'https://github.com/emqx/MQTT-Client-Examples'
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

$mqtt->loop(true);

测试

运行 MQTT 消息发布代码后,我们会看到客户端连接成功,消息已经一一发布并接收成功:

php pubsub_tcp.php

MQTT 发布/订阅过程

在本教程中演示了如何使用 PHP 中的 php-mqtt/client 库连接到 MQTT 代理、发布和订阅 MQTT 主题以及接收实时消息。这是使用 PHP 和 MQTT 构建功能强大的实时应用程序的基础步骤。

最近更新: 2025/7/31 16:02
贡献者: Tinywan
Prev
🔶 Redis搭建高并发电商秒杀系统
Next
🔶 MQTT消息协议初学者指南