插件窝 干货文章 ThinkPHP6中使用simps/mqtt连接MQTT服务器时如何解决“async-io must be used in PHP CLI mode”错误?

ThinkPHP6中使用simps/mqtt连接MQTT服务器时如何解决“async-io must be used in PHP CLI mode”错误?

使用 mqtt client 服务器 330    来源:    2025-03-13

在使用 simps/mqtt 连接 MQTT 服务器时,如果遇到 async-io must be used in PHP CLI mode 错误,通常是因为 simps/mqtt 依赖的异步 I/O 库(如 workermanswoole)需要在 CLI 模式下运行,而你在 Web 环境下(如通过 Apache 或 Nginx)运行了代码。

解决方法

  1. 在 CLI 模式下运行代码

    • 如果你需要在 Web 环境下使用 MQTT 客户端,可以考虑将 MQTT 客户端的运行逻辑放到一个独立的 CLI 脚本中,然后在 Web 环境下通过调用该脚本来实现功能。
    • 例如,创建一个 mqtt_client.php 文件,内容如下:

      <?php
      require __DIR__ . '/vendor/autoload.php';
      
      use Simps\MQTT\Client;
      use Simps\MQTT\Config\ClientConfig;
      
      $config = new ClientConfig();
      $config->setClientId('your_client_id');
      $config->setKeepAlive(60);
      
      $client = new Client('mqtt://your_mqtt_broker:1883', $config);
      
      $client->onConnect(function ($client) {
       echo "Connected\n";
       $client->subscribe('your_topic');
      });
      
      $client->onMessage(function ($topic, $message) {
       echo "Received message on topic {$topic}: {$message}\n";
      });
      
      $client->connect();
      $client->loop();
      
    • 然后在命令行中运行: bash php mqtt_client.php
  2. 使用 WebSocket 或其他协议

    • 如果你必须在 Web 环境下使用 MQTT,可以考虑使用 WebSocket 协议来连接 MQTT 服务器。WebSocket 可以在 Web 环境下使用,而不需要 CLI 模式。
    • 你可以使用 simps/mqtt 的 WebSocket 客户端来连接 MQTT 服务器。
  3. 使用 Swoole 或 Workerman 的 HTTP 服务器

    • 如果你需要在 Web 环境下使用异步 I/O,可以考虑使用 Swoole 或 Workerman 提供的 HTTP 服务器来替代传统的 Apache 或 Nginx。
    • 例如,使用 Swoole 创建一个 HTTP 服务器:

      <?php
      require __DIR__ . '/vendor/autoload.php';
      
      use Swoole\Http\Server;
      use Swoole\Http\Request;
      use Swoole\Http\Response;
      
      $server = new Server("0.0.0.0", 9501);
      
      $server->on("start", function (Server $server) {
       echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
      });
      
      $server->on("request", function (Request $request, Response $response) {
       $response->header("Content-Type", "text/plain");
       $response->end("Hello World\n");
      });
      
      $server->start();
      
    • 然后在这个 HTTP 服务器中集成 MQTT 客户端逻辑。

总结

async-io must be used in PHP CLI mode 错误是由于异步 I/O 库需要在 CLI 模式下运行。解决方法包括在 CLI 模式下运行代码、使用 WebSocket 协议、或者使用 Swoole/Workerman 提供的 HTTP 服务器来替代传统的 Web 服务器。根据你的具体需求选择合适的解决方案。