在本教程中,将使用 php-mqtt/client
库,它在 Composer 上的下载量最高。它是一种可靠、易于使用的解决方案,用于将 MQTT 集成到 PHP 应用程序中。如果您正在寻找其他用于 PHP 的 MQTT 客户端库,您可以在 Packagist 上探索更多选项。
MQTT 通信属于 HTTP 系统之外的网络通信场景。由于 PHP 特性的限制,在 PHP 系统中使用 Swoole/Workerman 等网络通信扩展可以带来更好的体验。
本文将不再重复其使用。相关的 MQTT 客户端库如下:
首先,请确保您使用的是 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 是一款功能强大的 PHP 依赖管理工具,可简化 PHP 项目所需库的安装。
要安装 php-mqtt/client 库,请在项目根目录中运行以下命令:
composer require php-mqtt/client
这将下载并安装 php-mqtt/client 库及其所有依赖项。安装完成后,您可以在 PHP 代码中使用该库。
本文将使用 EMQX 提供的免费公共 MQTT 代理 ,该代理是在 EMQX MQTT 平台上创建的。服务器访问信息如下:
在 PHP 代码中使用 php-mqtt/client 库之前,您需要导入 Composer 的自动加载文件。请在您的 PHP 脚本中添加以下代码:
require('vendor/autoload.php');
use \PhpMqtt\Client\MqttClient;
设置 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;
使用上述参数进行连接,并通过 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 构建功能强大的实时应用程序的基础步骤。