Centos8搭建Mosquitto(三)workerman/mqtt+workerman/mysql完成MQTT订阅消息持久存储Mysql数据库

Workerman是什么?

Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架。

Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的socket服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。

实际上Workerman类似一个PHP版本的nginx,核心也是多进程+Epoll+非阻塞IO。Workerman每个进程能维持上万并发连接。由于本身常住内存,不依赖Apache、nginx、php-fpm这些容器,拥有超高的性能。同时支持TCP、UDP、UNIXSOCKET,支持长连接,支持Websocket、HTTP、WSS、HTTPS等通讯协以及各种自定义协议。拥有定时器、异步socket客户端、异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。
本文用到
Workerman/MySQL
workerman\mqtt

因本文中系统先安装了宝塔因此安装workerman的过程中需要修改部分宝塔面板参数

首先安装官方文档检查安装环境

curl -Ss http://www.workerman.net/check.php | php
PHP Version >= 5.3.3                  [OK] 
Extension pcntl check                 [OK] 
Extension posix check                 [OK] 

Function pcntl_signal_dispatch may be disabled. Please check disable_functions in php.ini
see http://doc.workerman.net/faq/disable-function-check.html

按照结果检查
类似 pcntl_signal_dispatch 是因为宝塔面板PHP函数禁用了,编辑php.ini或通过面板删除,重载配置(如安装了多个版本PHP)需修改全部php.ini。可以通过
宝塔面板删除禁用函数后保

find / -name 'php.ini'

查看有几个配置文件
建议修改php.ini文件,后续有太多的被禁用函数~,一律删掉就对了。
不在重复
直至检测OK
先安装workerman/mqtt

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer require workerman/mqtt

注意此处有坑!
安装后
新增的文件夹为
vendor
目录结构

dir
autoload.php  composer  workerman
cd workerman
 dir
mqtt     workerman  workerman.log

注意:
如果目录结构不同注意调整以后测试代码autoload.php路径
我将测试文件放在

vendor/workerman

目录下,文件名sub.php,由examples例程修改而来
注意编辑`

require __DIR__ . '/../../vendor/autoload.php';

以上根据自己目录调整。
安装Workman/mysql
因已安装宝塔mysql省去说明中MySQL安装部分
直接安装

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer require workerman/mysql

目录位置
在这里插入图片描述
在这里插入图片描述
sub.php文件内容

<?php
require __DIR__ . '/../../vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;

$worker = new Worker();
$worker->onWorkerStart = function(){
    global $db;
    $db = new \Workerman\MySQL\Connection('数据库地址', '3306', '用户名', '密码', '数据库名称');
    $mqtt = new Workerman\Mqtt\Client('mqtt:/你的地址:1883',array(
        'username'       => 'yk001',//修改成你自己的
                'password' => '123456',//修改成你自己的
        'debug' => true
    ));
    $mqtt->onConnect = function($mqtt) {
        $mqtt->subscribe('mqttqc');//修改成你自己的
    };
    $mqtt->onMessage = function($topic, $content,$mqtt1){
         global $db;
          $nowtime= time();
         $insert_id = $db->query("INSERT INTO `qc_device_mqtt` ( `topic`, `content`, `create_time`) //修改成你自己的
VALUES ('$topic', '$content', '$nowtime')");

        //echo "topic:$topic content:$content\n";
        
    };
    $mqtt->connect();
};
Worker::runAll();

在sub.php所在目录下执行

php sub.php start
php sub.php start
Workerman[sub.php] start in DEBUG mode
------------------------------------- WORKERMAN --------------------------------------
Workerman version:4.0.16          PHP version:7.2.32
-------------------------------------- WORKERS ---------------------------------------
proto   user            worker          listen          processes    status           
tcp     root            none            none            1             [OK]            
--------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
-> Try to connect to mqtt:// 你的地址
-- Tcp connection established
-> Send CONNECT package client_id:workerman-mqtt-client-2054120855 username:yk001 password:123456 clean_session:1 protocol_name:MQTT protocol_level:4
<- Recv CONNACK package, MQTT connect success
-> Send SUBSCRIBE package, topic:mqttqc message_id:1
<- Recv SUBACK package, message_id:1

用客户端向workerman订阅的这个主题发一个消息,测试一下数据是不是存到数据库了(如果不成功会有相应提示)。我是吧内容直接存进mysql建的content字段,类型text。

至此,完成基本调试操作,后续要整合到我的其他代码,实现其他功能。

猜你喜欢

转载自blog.csdn.net/taogunet/article/details/110133274
今日推荐