【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);
            }
        }

 

搞定

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM