workerman\mqtt在使用 'protocol_level' => 5 时连接,然后消息的回调第一次主题的参数是正确的,接收第二次以后得消息回调,主题就为空了
$mqtt->onMessage = function ($topic, $content, $packet) {
    echo $topic . ":" . $content . PHP_EOL;
};
第一次可以正常显示,第二次以后$topic 就为空了
<?php
require __DIR__ . '/vendor/autoload.php';
use Workerman\Timer;
use Workerman\Worker;
$worker = new Worker('websocket://0.0.0.0:8282');
$worker->name   = 'mqtt';
// 这里进程数必须设置为1
$worker->count = 1;
$worker->onWorkerStart = function (Worker $worker) {
    //初始化mqtt进行连接
    $mqtt = new Workerman\Mqtt\Client('mqtt://127.0.0.1:1883', array(
        'debug'          => false,
        "client_id"      => "workerman_server",
        "keepalive"      => 60,
        "username"       => "workerman_server", "password" => "Ufo@8888",
        "clean_session"  => false,
        'properties'     => [
            'session_expiry_interval' => 60,
            'receive_maximum'         => 65535,
            'topic_alias_maximum'     => 65535,
        ],
        'protocol_level' => 5, //使用协议5时接收到订阅消息回调函数中topic会有空值的问题,所以不能使用5的协议版本
    ));
    $mqtt->onConnect = function (Workerman\Mqtt\Client $mqtt)  {
        //连接成功后启动一个心跳主题进行定时发布
        Timer::add(5, function () use ($mqtt) {
            $mqtt->publish('heart',
                '{"cmd":"heart",  "time":"' . date('Y-m-d H:i:s') . '"}',
                [
                    'qos'    => 0,
                    'retain' => 0,
                    'dup'    => 0,
                ]
            );
        });
        //默认连接成功订阅 heart主题
        $mqtt->subscribe('heart');
    };
    $mqtt->onMessage = function ($topic, $content, $packet) {
        echo $topic . ":" . $content . PHP_EOL;
    };
    // 连接mqtt
    $mqtt->connect();
};
Worker::runAll();
消息回调,第一次可以显示回调的主题,以后进不能显示了

Ubuntu22.04
workerman v4.1.16
workerman\mqtt v1.6
把你的脚本拷贝了一遍,没改任何东西,测试正常。

mqtt服务端用的mosquitto
难道是我系统的php版本的问题吗?我的php版本是7.4。我再测试下吧。
更换php版本后一样的问题,我暂时找不到哪里的问题了。
和php版本没关系,可能是mqtt客户端不是最新,或者mqtt服务端有问题。
我测试的环境版本如下
workerman/mqtt 1.6
mqtt服务端 mosquitto 2.0.18
好的,我的mqtt的服务器是emqx v1.0.1 可能和mqtt服务器有关系。
是因为mqtt 5 启用了主题别名,把 topic_alias_maximum 这个设置为0 禁用别名后,同一主题后的topic就会显示了。
连接mqtt的时候启用debug,然后打印出来的package,就有properties:{"topic_alias":1}这样参数,这个这个时候topic就是空。