在使用 simps/mqtt
连接 MQTT 服务器时,如果遇到 async-io must be used in PHP CLI mode
错误,通常是因为 simps/mqtt
依赖的 workerman
或 react/event-loop
等异步库需要在 CLI 模式下运行,而不能在传统的 PHP-FPM 或 Apache 模式下运行。
simps/mqtt
使用了异步 I/O 库(如 workerman
或 react/event-loop
),这些库通常需要在 CLI 模式下运行,因为它们依赖于事件循环(Event Loop)来处理异步任务。而在 PHP-FPM 或 Apache 模式下,PHP 是同步执行的,无法支持这种异步操作。
要解决这个问题,你可以采取以下几种方法:
将你的 MQTT 客户端代码放在 CLI 模式下运行,而不是通过 Web 服务器(如 Apache 或 Nginx)运行。你可以创建一个 PHP 脚本,并通过命令行来执行它。
例如,创建一个 mqtt_client.php
文件:
<?php
require __DIR__ . '/vendor/autoload.php';
use Simps\MQTT\Client;
$client = new Client('mqtt://broker.hivemq.com:1883', []);
$client->onConnect = function ($client) {
echo "Connected\n";
$client->subscribe('test/topic');
};
$client->onMessage = function ($topic, $message) {
echo "Received message on topic $topic: $message\n";
};
$client->connect();
然后通过命令行运行:
php mqtt_client.php
如果你必须在 Web 环境下使用 MQTT,可以考虑使用 WebSocket 协议来连接 MQTT 服务器。WebSocket 可以在浏览器和服务器之间建立持久连接,并且可以在 Web 环境下使用。
你可以使用 simps/mqtt
的 WebSocket 客户端,或者使用其他支持 WebSocket 的 MQTT 客户端库。
如果你需要在 Web 环境下处理 MQTT 消息,可以考虑将 MQTT 消息推送到一个消息队列(如 Redis、RabbitMQ 等),然后在 Web 应用中消费这些消息。这样可以将 MQTT 客户端的运行与 Web 应用解耦。
如果你无法在 Web 环境下直接使用 MQTT,可以考虑使用长轮询或 WebHook 的方式来接收 MQTT 消息。MQTT 服务器可以将消息推送到一个 HTTP 端点,然后你的 Web 应用可以通过这个端点来接收消息。
async-io must be used in PHP CLI mode
错误是由于异步 I/O 库需要在 CLI 模式下运行。要解决这个问题,你可以选择在 CLI 模式下运行 MQTT 客户端,或者使用 WebSocket、消息队列等其他技术来间接处理 MQTT 消息。