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