1. 程式人生 > >使用workerman進行訊息推送

使用workerman進行訊息推送

Workerman是一款純PHP開發的開源高效能的PHP socket 伺服器框架。被廣泛的用於手機app、移動通訊,微信小程式,手遊服務端、網路遊戲、PHP聊天室、硬體通訊、智慧家居、車聯網、物聯網等領域的開發。 支援TCP長連線,支援Websocket、HTTP等協議,支援自定義協議。擁有非同步Mysql、非同步Redis、非同步Http、非同步訊息佇列等眾多高效能元件。與之類似的還有swoole,MeepoPS。

首先下載workerman的Web訊息推送系統 web-msg-sender。

# wget http://www.workerman.net/download/senderzip
# unzip senderzip #cd web-msg-sender #vim start.php
use Workerman\Worker;
// composer 的 autoload 檔案
include __DIR__ . '/vendor/autoload.php';

if(strpos(strtolower(PHP_OS), 'win') === 0)
{
    exit("start.php not support windows, please use start_for_win.bat\n");
}

// 標記是全域性啟動
define('GLOBAL_START', 1
); // 載入IO 和 Web require_once __DIR__ . '/start_io.php'; 可以註釋掉 webServer 服務 沒什麼用 省點資源 // require_once __DIR__ . '/start_web.php'; // 執行所有服務 Worker::runAll(); 儲存
#vim start_io.php
找到 將埠改成你要監聽的埠 我是2120 記住要在安全組裡入方向新增白名單
// PHPSocketIO服務 
$sender_io = new SocketIO(2120);
服務端設定完畢後
#php start.php start -d //開啟服務 並保持程序
推送類 我用的tp5
<?php
namespace app\index\moudel; 
/**
 * 推送事件
 * 典型呼叫方式:
 * $push = new WebSocket();
 * $push->setUser($user_id)->setContent($string)->push();//連貫操作
 *
 * Class WebSocket
 * @package app\index\moudel; 
 */
class WebSocket
{
    /**
     * @var string 目標使用者id
     */
    protected $to_user = '';

    /**
     * @var string 推送服務地址 
     */
    protected $push_api_url = 'http://127.0.0.1:2000';

    /**
     * @var string 推送內容
     */
    protected $content = '';

    /**
     * 設定推送使用者,若引數留空則推送到所有線上使用者
     *
     * @param string $user
     * @return $this
     */
    public function setUser($user = '')
    {
        $this->to_user = $user ? : '';
        return $this;
    }
    /**
     * 設定推送內容
     *
     * @param string $content
     * @return $this
     */
    public function setContent($content = '')
    {
        $this->content = $content;
        return $this;
    }

    /**
     * 推送
     */
    public function push()
    {
        $data = [
            'type' => 'publish',
            'content' => $this->content,
            'to' => $this->to_user,
        ];
        // var_dump($data);
        // var_dump($this->push_api_url);

        $ch = curl_init ();
        curl_setopt($ch, CURLOPT_URL, $this->push_api_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
        $res = curl_exec($ch);
        curl_close($ch);
        dump($res);

    }
}
操作控制器
<?php
namespace app\index\controller;
use think\Controller;
use app\index\moudel\WebSocket;
class Index extends Controller
{
 /**
     * 推送一個字串
     */
    public function push_msg(){
        $uid = input('uid','');//uid為空的時候推送給所有使用者
        $string = '這是一個推送的測試';
        $string = input('msg') ? : $string;
        $push = new WebSocket();
        $push->setUser($uid)->setContent($string)->push();
    }

    /**
     * 推送目標頁
     *
     * @return \think\response\View
     */
    public function targetPage(){
        return view();
    }
}    
推送目標的前端顯示
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<strong id="count"></strong>

<h1 id="target"></h1>
</body>
</html>
<script src="http://cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script>
<script src='http://cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
    jQuery(function ($) {

        // 連線服務端
        var socket = io('http://39.106.132.216:2000/'); //這裡當然填寫真實的地址了
        // uid可以是自己網站的使用者id,以便針對uid推送以及統計線上人數,但一定是唯一標識
        uid = 321;
        // socket連線後以uid登入
        socket.on('connect', function () {
            socket.emit('login', uid);
        });
        // 後端推送來訊息時
        socket.on('new_msg', function (msg) {
            console.log("收到訊息:" + msg);
            $('#target').append(msg).append('<br>');
        });
        // 後端推送來線上資料時
        socket.on('update_online_count', function (online_stat) {
            console.log(online_stat);
            $('#count').html(online_stat);
        });
    })
</script>
http://我自己的域名/index/index/pushAString?uid=123
ok 為推送成功
offline 為未線上
fail 為失敗

前端成功展示 321為我自定義的uid
這裡寫圖片描述

相關推薦

使用workerman進行訊息

Workerman是一款純PHP開發的開源高效能的PHP socket 伺服器框架。被廣泛的用於手機app、移動通訊,微信小程式,手遊服務端、網路遊戲、PHP聊天室、硬體通訊、智慧家居、車聯網、物聯網等領域的開發。 支援TCP長連線,支援Websocket、HT

使用websocket進行訊息服務

Websocket主要做訊息推送,簡單,輕巧,比comet好用 入門瞭解:https://www.cnblogs.com/xdp-gacl/p/5193279.html   /** * A Web Socket session represents a conversation bet

SpringBoot中使用Websocket進行訊息

WebsocketConfig.java @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return

呼叫cordova相關外掛進行訊息(通知欄提醒、響鈴、震動)

原文: 呼叫cordova相關外掛進行訊息推送(通知欄提醒、響鈴、震動) 最近專案中需要對自己軟體的備忘錄進行訊息推送,從而提醒使用者。閒話就不多說了,將自己用到的外掛以及使用方法簡單分享一下,有什麼做的不好的地方或者好的建議歡迎隨時提出,謝謝! 一、本地訊息通知外掛,這裡使用cor

【轉 】workerman 實現訊息

WEB訊息推送框架 web-msg-sender是一款web長連線推送框架,採用PHPSocket.IO開發,基於WebSocket長連線通訊,如果瀏覽器不支援WebSocket則自動轉用comet推送。 通過後臺推送訊息,訊息可以即時推送到客戶端,非輪詢

Workerman之WEB訊息框架使用筆記【一】

伺服器使用的時候需要注意雲盾和360埠攔截 下載解壓到任意目錄 cd到目錄下執行 start.php linux :php start.php start -d win:直接執行start_

spring boot 整合activemq 進行服務端訊息(web頁面)

最近公司的專案裡有需要服務端向web端實時推送訊息的需求,網上搜索了一番,有前端頁面通過定時任務向後臺傳送ajax請求重新整理,有使用第三方提供的訊息服務(GoEasy),前者因為會有很多請求是無用的,容易加大伺服器負荷造成宕機,後者現在收費了(免費的也只能用一

Android 基於Netty的訊息方案之物件的傳遞(四)

在上一篇文章中《Android 基於Netty的訊息推送方案之字串的接收和傳送(三)》我們介紹了Netty的字串傳遞,我們知道了Netty的訊息傳遞都是基於流,通過ChannelBuffer傳遞的,那麼自然,Object也需要轉換成ChannelBuffer來傳遞。好在Netty本身已經給我們寫好了

Android 基於Netty的訊息方案之字串的接收和傳送(三)

在上一篇文章中《Android 基於Netty的訊息推送方案之概念和工作原理(二)》 ,我們介紹過一些關於Netty的概念和工作原理的內容,今天我們先來介紹一個叫做ChannelBuffer的東東。 ChannelBuffer  Netty中的訊息傳遞,都必須以位元

Android 基於Netty的訊息方案之概念和工作原理(二)

上一篇文章中我講述了關於訊息推送的方案以及一個基於Netty實現的一個簡單的Hello World,為了更好的理解Hello World中的程式碼,今天我來講解一下關於Netty中一些概念和工作原理的內容,如果你覺得本篇文章有些枯燥,請先去閱讀《Android 基於Netty的訊息推送方案之Hell

IOS APNS訊息框架介紹(pushy)以及詳細使用方法

最近公司需要做IOS訊息推送的功能,我負責後臺推送,IOS端資料處理以及回撥我不負責,本篇文章主要介紹基於java的apns訊息推送,使用框架為pushy。 宣告:我先前也沒有接觸過這個IOS推送,自己研究了兩天,通過百度,對比各個框架的優缺點,最後選擇了這個框架,有說的不對的地方,還

android 實現mqtt訊息,以及不停斷線重連的問題解決

前段時間專案用到mqtt的訊息推送,整理一下程式碼,程式碼的原型是網上找的,具體哪個地址已經忘記了。 程式碼的實現是新建了一個MyMqttService,全部功能都在裡面實現,包括連伺服器,斷線重連,訂閱訊息,處理訊息,釋出訊息等基本操作。 首先新增依賴: dependencies { &

基於Netty實現的Android 訊息(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

百度雲訊息

import com.baidu.yun.core.log.YunLogEvent; import com.baidu.yun.core.log.YunLogHandler; import com.baidu.yun.push.auth.PushKeyPair; import com.baidu.yun

微信公總號訊息

                   * 任務完成給製作者推送訊息          &nbs

Android UDP - 簡單訊息功能

近期接觸了幾個小的Android開發專案,根據需求要利用到網路傳輸中的UDP協議方式傳輸,遇到不少坑,在此分享一下在Android應用中UDP的一些簡單技術功能實現,希望能幫到用得到的同僚。 需(wo)求(yao)分(gan)析(ma): 從PC上輸入一串亂七八糟,然後能在我手機(某為pow

[轉]spring boot下WebSocket訊息

原文連結:spring boot下WebSocket訊息推送, 修正部分錯別字 WebSocket協議 WebSocket是一種在單個TCP連線上進行全雙工通訊的協議。WebSocket通訊協議於2011年被IETF定為標準RFC 6455,並由RFC7936補充規範。WebSocket A

Django——微信訊息

前言 微信公眾號的分類 微信訊息推送 公眾號 已認證公眾號 服務號 已認證服務號 企業號 基於:微信認證服務號 主動推送微信訊息。 前提:關注服務號 環境:沙箱環境 沙箱環境地址: https:/

RabbitMQ訊息總結

藉助於 RabbitMQ 的 Web STOMP 外掛,實現瀏覽器與服務端的全雙工通訊。從本質上說,RabbitMQ 的 Web STOMP 外掛也是利用 WebSocket 對 STOMP 協議進行了一次橋接,從而實現瀏覽器與服務端的雙向通訊。 安裝 RabbitMQ 服務

iOS訊息機制

  Little_Dragon  關注 2015.10.05 22:33*  字數 1253  閱讀 17337 評論 36 喜歡 151 推送