zoukankan      html  css  js  c++  java
  • 【phpMQTT】phpMQTT详解以及处理使用过程中内存耗死问题

    参考文档: https://www.cloudmqtt.com/docs-php.html

    github下载 : https://github.com/bluerhinos/phpMQTT

    CloudMQTT 概述: https://www.cloudmqtt.com/docs.html

    CloudMQTT 除了有php的类库,还有python,java.net等mqtt的类库。

    一、phpMQTT详解

    客户端发布:

    //publish.php
      require("phpMQTT.php");
    
      $host = "hostname"; //主机
      $port = port; //端口
      $username = "username"; //如果没有则为空 
      $password = "password"; //如果没有则为空
      $message = "Hello CloudMQTT!"; //要发送的消息
    
      //phpMQTT 有四个参数:主机,端口,客户端id,证书。官网这里的案例没写证书,请参考phpMQTT类
      //没有证书的时候只能连接1883端口,不能连接8883端口。
      $mqtt = new phpMQTT($host, $port, "ClientID".rand()); 
      //连接
      if ($mqtt->connect(true,NULL,$username,$password)) {
        $mqtt->publish("topic",$message, 0);
        $mqtt->close(); //关闭
      }else{
        echo "Fail or time out<br />";
      }
    服务端订阅
    // 注意:订阅请用窗口或者后台去运行,不要再页面运行。
      require("phpMQTT.php");
      ignore_user_abort(true); // 后台运行
      set_time_limit(0); // 取消脚本运行时间的超时上限
      date_default_timezone_set('PRC'); //设置中国时区
    
      $host = "hostname"; 
      $port = port;
      $username = "username"; 
      $password = "password"; 
      //同样这里少了证书参数
      $mqtt = new phpMQTT($host, $port, "ClientID".rand()); 
    
      if(!$mqtt->connect(true,NULL,$username,$password)){
        exit(1);
      }
    
      //currently subscribed topics
      $topics['topic'] = array("qos"=>0, "function"=>"procmsg");
      $mqtt->subscribe($topics,0);
    
      while($mqtt->proc()){ //无限去请求
      }
    
      $mqtt->close();
      function procmsg($topic,$msg){//输出消息
        echo "Msg Recieved: $msg";
      }
    

    二、内存耗死问题

    场景:(订阅)链接不上mqtt的时候,一下代码会出错:

    文件名: phpMQTT.php 

    错误分析:链接不到mqtt的时候,$this->socket这个结果为false,while里面的一直会循环,$string的大小会耗死内存。所以加一个判断,按如下代码修改。

          if ($this->socket) {
                while (!feof($this->socket) && $togo>0) {
                    $fread = fread($this->socket, $togo);
                    $string .= $fread;
                    $togo = $int - strlen($string);
                }
            }

    搞定

  • 相关阅读:
    创建Graphics对象与Pen对象
    GDI+图形图像处理技术——GDIPlus绘图基础
    WPF的组成架构
    文件监控只FileSystemWatcher控件
    文件夹选择之FolderBrowserDialog控件
    SaveFileDialog控件
    文件选择之OpenFileDialog控件
    编码与解码
    写一个翻译小工具
    【转】字符集与字符编码简介
  • 原文地址:https://www.cnblogs.com/richerdyoung/p/10113744.html
Copyright © 2011-2022 走看看