php 服務端主動向客戶端推送消息, php swoole websocket, 服務端向客戶端推送消息, websocket主動推送消息


php + swoole 實現服務端主動推送消息

教學視頻分享: http://zixueit.cn/  點擊鏈接搜索  Swoole入門到實戰

swoole: 完美的實現了PHP的異步、並行、高性能網絡通信引擎,支持TCP長連接,Websocket,Mqtt等協議,再開發過程中,當我們需要一套自己的銷售系統的時候難以避免的就是消息推送,不多嗶嗶直接干

項目場景:公司開發的管理后台,將銷售人員納入管理系統當中,將收集的意向用戶的信息分發給銷售人員,分發后需要即時向銷售人員發送通知

使用到swoole函數

server->on  swoole回調函數

onopen()  打開

onmessage()  消息函數,接收客戶端消息后觸發  必選函數

onclose()   關閉

start()    初始化
借助以上幾個函數,並結合數據、業務邏輯即可實現服務端向客戶端的消息推送以下為簡單的demo僅供參考
demo效果圖
<?php
#!/www/server/php/72/bin/php -q
class init{
  
  public $db;
  public $ws;
  public $link;
  public function __construct(){
  $this->ws = new Swoole\WebSocket\Server("0.0.0.0", 9502);    實例化websocket的類  並且連接我們的開放給swoole的端口
  $this->ws->on('open', function ($ws, $request) {
  
  $this->link = $ws->getClientInfo($request->fd);
  $this->message($request->fd);
  此處調用自定義的方法取出數據庫中的要發送的數據
  });
  $this->ws->on('message', function ($ws, $frame) {

  });
  //監聽 WebSocket 連接關閉事件
  $this->ws->on('close', function ($ws, $fd) {
  # echo "client-{$fd} is closed\n";
  });
  $this->ws->start();

  }
  以上的函數上面有提到,具體含義可以在文章頭部的分享連接中找到
 
  public function message($fd)  該方法為自定義方法,目的在於取出數據庫中的要發送的數據推送給客戶端
  {
    $service = $this->ws;
    $db = new PDO('mysql:host=自己的ip地址;dbname=數據庫名', '數據庫用戶名', '密碼');
    $sql = "select title, created_at,id from 表名 where (`news_status` = 0 and `receive_id` = 1) or `is_all` = 1 order by `news_rank` asc, `created_at` desc";
    $array = $db->query($sql);
    foreach($array as $k=>$v)
    {
      $data[$k]['title'] = $v['title'];
      $data[$k]['crated_at'] = $v['created_at'];
      $data[$k]['id'] = $v['id'];
    }
    $data = json_encode($data);
    $this->ws->tick(15000, function() use ($service, $fd, $data){
    #$data = Array('自古英雄多寂寥','我言秋日勝春朝','晴空一鶴排雲上','便引詩情到碧霄','道可道非常道','名可名非常名','啦啦啦啦啦啦','啊啊啊啊啊啊','小黑屋');
    #$service->push($fd, "server: ".$data[array_rand($data)]);
    $service->push($fd, $data);
 });
}
}
  new init();
以上就是服務端的代碼,具體的含義因個人理解不夠深刻不逐步解釋以免誤導大家,大家可以參考上面的分享連接,進行下載教程
服務端代碼編輯好后我們看下客戶端代碼,簡單的令人發指

var wsServer = 'ws://IP地址+端口;
//調用 websocket 對象建立連接:
//參數:ws/wss(加密)://ip:port (字符串)
var websocket = new WebSocket(wsServer);
//onopen 監聽連接打開
websocket.onopen = function (evt) {
//websocket.readyState 屬性:
console.log(evt)
console.log(websocket.readyState);
};

function sending() {
var text = document.getElementById('text').value;
document.getElementById('text').value = '';
//向服務器發送數據
websocket.send(text);
}
//監聽連接關閉
websocket.onclose = function (evt) {
msg.innerHTML+="Disconnected<br>";
};

//onmessage 監聽服務器數據推送
websocket.onmessage = function (evt) {
fordata(evt)
};
//監聽連接錯誤信息
websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
};

客戶端展示代碼,只是demo逐步注釋

最終效果


免責聲明!

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



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