php使用simps/mqtt报错 async-io must be used in PHP CLI mode

报错信息:

0 [1]ErrorException in Client.php line 66

Swoole\Coroutine\Client::connect(): async-io must be used in PHP CLI mode

已安装
composer require simps/mqtt

已安装swoole
image.png
image.png

代码如下(thinkphp6):

//simps
use Simps\MQTT\Client;
use Simps\MQTT\Config\ClientConfig;
use function Swoole\Coroutine\run;

class Index extends BaseController
{


    public function test(){


  $config = [
            'access_key' => '1', // 阿里云帐号 AccessKey
            'secret_key' => '2', // 阿里云帐号 SecretKey
            'end_point' => '3', // 接入点地址,购买实例后从控制台获取
            'instance_id' => '4', // 实例 ID,购买后从控制台获取
            'topic' => 'test_mqtt_topic', // MQTT Topic,其中第一级 Topic 需要在 MQTT 控制台提前申请
            'group_id' => 'GID_tt1', //  MQTT 客户端ID 前缀, GroupID,需要在 MQTT 控制台申请
        ];

        // MQTT 客户端ID 后缀,DeviceId,业务方自由指定,需要保证全局唯一,禁止 2 个客户端连接使用同一个 ID
        $deviceId = Client::genClientID();
        $qos = 0;
        $port = 1883;
        $keepalive = 90;
        $cleanSession = true;
        $clientId = $config['group_id'] . '@@@' . $deviceId;
        echo "ClientId: {$clientId}", PHP_EOL;

        // 设置鉴权参数,参考 MQTT 客户端鉴权代码计算 username 和 password
        $username = 'Signature|' . $config['access_key'] . '|' . $config['instance_id'];
        $sigStr = hash_hmac("sha1", $clientId, $config['secret_key'], true);
        $password = base64_encode($sigStr);
        echo "UserName: {$username} \r\nPassword: {$password}", PHP_EOL;

        // 初始化客户端配置
        $clientConfig = new ClientConfig();
        $clientConfig->setUserName($username)
            ->setPassword($password)
            ->setClientId($clientId)
            ->setKeepAlive($keepalive)
            ->setMaxAttempts(0)
            ->setSwooleConfig([
                'open_mqtt_protocol' => true,
                'package_max_length' => 2 * 1024 * 1024,
            ]);



        try {
            // 初始化客户端
            $client = new Client($config['end_point'], $port, $clientConfig);

            $connect = $client->connect($cleanSession);
            // 连接状态
            var_dump($connect);



            $topics[$config['topic']] = $qos;
            $subStatus = $client->subscribe($topics);
            // 订阅状态
            var_dump($subStatus);

            $publishStatus = $client->publish($config['topic'], "Hello MQTT PHP Demo", $qos);
            // 发布状态
            var_dump($publishStatus);

            $buffer = $client->recv();
            // 订阅消息接收
            var_dump($buffer);

            echo 'Finished';
        } catch (\Throwable $e) {
            echo $e->getMessage();
        }

}
阅读 4.7k
2 个回答

swoole 只能在 CLI 下运行,不能运行在 FPM。

即你可以写成 Command 然后再命令行用 php think <command> 的形式运行。

协程Client只能在 cli 模式运行,在 fpm 中需要使用同步阻塞Client。

参考 https://github.com/simps/mqtt...

fpm 下只适合publish这种场景,不适合订阅的场景。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题