首頁  >  文章  >  php框架  >  如何使用workerman進行訊息推送

如何使用workerman進行訊息推送

藏色散人
藏色散人轉載
2020-01-17 16:08:514442瀏覽

下面由workerman教學欄位介紹給大家介紹使用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 = &#39;&#39;;
    /**
     * @var string 推送服务地址 
     */
    protected $push_api_url = &#39;http://127.0.0.1:2000&#39;;
    /**
     * @var string 推送内容
     */
    protected $content = &#39;&#39;;
    /**
     * 设置推送用户,若参数留空则推送到所有在线用户
     *
     * @param string $user
     * @return $this
     */
    public function setUser($user = &#39;&#39;)
    {
        $this->to_user = $user ? : &#39;&#39;;
        return $this;
    }
    /**
     * 设置推送内容
     *
     * @param string $content
     * @return $this
     */
    public function setContent($content = &#39;&#39;)
    {
        $this->content = $content;
        return $this;
    }
    /**
     * 推送
     */
    public function push()
    {
        $data = [
            &#39;type&#39; => &#39;publish&#39;,
            &#39;content&#39; => $this->content,
            &#39;to&#39; => $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(&#39;Expect:&#39;));
        $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(&#39;uid&#39;,&#39;&#39;);//uid为空的时候推送给所有用户
        $string = &#39;这是一个推送的测试&#39;;
        $string = input(&#39;msg&#39;) ? : $string;
        $push = new WebSocket();
        $push->setUser($uid)->setContent($string)->push();
    }
    /**
     * 推送目标页
     *
     * @return \think\response\View
     */
    public function targetPage(){
        return view();
    }
}

推送目標的前端顯示

<!DOCTYPE html>
<html>
<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=&#39;http://cdn.bootcss.com/socket.io/1.3.7/socket.io.js&#39;></script>
<script>
    jQuery(function ($) {
        // 连接服务端
        var socket = io(&#39;http://39.106.132.216:2000/&#39;); //这里当然填写真实的地址了
        // uid可以是自己网站的用户id,以便针对uid推送以及统计在线人数,但一定是唯一标识
        uid = 321;
        // socket连接后以uid登录
        socket.on(&#39;connect&#39;, function () {
            socket.emit(&#39;login&#39;, uid);
        });
        // 后端推送来消息时
        socket.on(&#39;new_msg&#39;, function (msg) {
            console.log("收到消息:" + msg);
            $(&#39;#target&#39;).append(msg).append(&#39;<br>&#39;);
        });
        // 后端推送来在线数据时
        socket.on(&#39;update_online_count&#39;, function (online_stat) {
            console.log(online_stat);
            $(&#39;#count&#39;).html(online_stat);
        });
    })
</script>
http://我自己的域名/index/index/pushAString?uid=123
ok 为推送成功
offline 为未在线
fail 为失败

前端成功展示321為我自訂的uid

如何使用workerman進行訊息推送

以上是如何使用workerman進行訊息推送的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除