如何在php后端及时推送消息给客户端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在php后端及时推送消息给客户端相关的知识,希望对你有一定的参考价值。

<?php
use Workerman\\Worker;
require_once \'./Workerman/Autoloader.php\';
// 初始化一个worker容器,监听1234端口
$worker = new Worker(\'websocket://0.0.0.0:1234\');
// 这里进程数必须设置为1
$worker->count = 1;
// worker进程启动后建立一个内部通讯端口
$worker->onWorkerStart = function($worker)

// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker(\'Text://0.0.0.0:5678\');
$inner_text_worker->onMessage = function($connection, $buffer)

global $worker;
// $data数组格式,里面有uid,表示向那个uid的页面推送数据
$data = json_decode($buffer, true);
$uid = $data[\'uid\'];
// 通过workerman,向uid的页面推送数据
$ret = sendMessageByUid($uid, $buffer);
// 返回推送结果
$connection->send($ret ? \'ok\' : \'fail\');
;
$inner_text_worker->listen();
;
// 新增加一个属性,用来保存uid到connection的映射
$worker->uidConnections = array();
// 当有客户端发来消息时执行的回调函数
$worker->onMessage = function($connection, $data)use($worker)

// 判断当前客户端是否已经验证,既是否设置了uid
if(!isset($connection->uid))

// 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
$connection->uid = $data;
/* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
* 实现针对特定uid推送数据
*/
$worker->uidConnections[$connection->uid] = $connection;
return;

;

// 当有客户端连接断开时
$worker->onClose = function($connection)use($worker)

global $worker;
if(isset($connection->uid))

// 连接断开时删除映射
unset($worker->uidConnections[$connection->uid]);

;

// 向所有验证的用户推送数据
function broadcast($message)

global $worker;
foreach($worker->uidConnections as $connection)

$connection->send($message);



// 针对uid推送数据
function sendMessageByUid($uid, $message)

global $worker;
if(isset($worker->uidConnections[$uid]))

$connection = $worker->uidConnections[$uid];
$connection->send($message);
return true;

return false;


// 运行所有的worker(其实当前只定义了一个)
Worker::runAll();

启动后端服务
php push.php start -d

前端接收推送的js代码
var ws = new WebSocket(\'ws://127.0.0.1:1234\');
ws.onopen = function()
var uid = \'uid1\';
ws.send(uid);
;
ws.onmessage = function(e)
alert(e.data);
;

后端推送消息的代码
// 建立socket连接到内部推送端口
$client = stream_socket_client(\'tcp://127.0.0.1:5678\', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array(\'uid\'=>\'uid1\', \'percent\'=>\'88%\');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\\n");
// 读取推送结果
echo fread($client, 8192);

这里的uid不一定是用户的id,也可以理解为任务id即 taskid

以上代码亲测可以直接使用
参考技术A 后端代码push.php

WorkerMan中php后端及时推送消息给客户端

php后端及时推送消息给客户端

原理:

1、建立一个websocket Worker,用来维持客户端长连接

2、websocket Worker内部建立一个text Worker

3、websocket Worker 与 text Worker是同一个进程,可以方便的共享客户端连接

4、某个独立的php后台系统通过text协议与text Worker通讯

5、text Worker操作websocket连接完成数据推送

代码及步骤

push.php

  

<?php

use WorkermanWorker;

require_once ‘./Workerman/Autoloader.php‘;

// 初始化一个worker容器,监听1234端口

$worker = new Worker(‘websocket://0.0.0.0:1234‘);//

  

/*

 * 注意这里进程数必须设置为1,否则会报端口占用错误

 * (php 7可以设置进程数大于1,前提是$inner_text_worker->reusePort=true)

 */

$worker->count = 1;

// worker进程启动后创建一个text Worker以便打开一个内部通讯端口

$worker->onWorkerStart = function($worker)

{

    // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符

    $inner_text_worker = new Worker(‘text://0.0.0.0:5678‘);

    $inner_text_worker->onMessage = function($connection, $buffer)

    {

        // $data数组格式,里面有uid,表示向那个uid的页面推送数据

        $data = json_decode($buffer, true);

        $uid = $data[‘uid‘];

        // 通过workerman,向uid的页面推送数据

        $ret = sendMessageByUid($uid, $buffer);

        // 返回推送结果

        $connection->send($ret ? ‘ok‘ : ‘fail‘);

    };

    // ## 执行监听 ##

    $inner_text_worker->listen();

};

// 新增加一个属性,用来保存uid到connection的映射

$worker->uidConnections = array();

// 当有客户端发来消息时执行的回调函数

$worker->onMessage = function($connection, $data)

{

    global $worker;

    // 判断当前客户端是否已经验证,既是否设置了uid

    if(!isset($connection->uid))

    {

       // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)

       $connection->uid = $data;

       /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,

        * 实现针对特定uid推送数据

        */

       $worker->uidConnections[$connection->uid] = $connection;

       return;

    }

};

  

// 当有客户端连接断开时

$worker->onClose = function($connection)

{

    global $worker;

    if(isset($connection->uid))

    {

        // 连接断开时删除映射

        unset($worker->uidConnections[$connection->uid]);

    }

};

  

// 向所有验证的用户推送数据

function broadcast($message)

{

   global $worker;

   foreach($worker->uidConnections as $connection)

   {

        $connection->send($message);

   }

}

  

// 针对uid推送数据

function sendMessageByUid($uid, $message)

{

    global $worker;

    if(isset($worker->uidConnections[$uid]))

    {

        $connection = $worker->uidConnections[$uid];

        $connection->send($message);

        return true;

    }

    return false;

}

  

// 运行所有的worker

Worker::runAll();

启动后端服务 php push.php start -d

  

前端接收推送的js代码

  

var ws = new WebSocket(‘ws://127.0.0.1:1234‘);

ws.onopen = function(){

    var uid = ‘uid1‘;

    ws.send(uid);

};

ws.onmessage = function(e){

    alert(e.data);

};

后端推送消息的代码

  

// 建立socket连接到内部推送端口

$client = stream_socket_client(‘tcp://127.0.0.1:5678‘, $errno, $errmsg, 1);

// 推送的数据,包含uid字段,表示是给这个uid推送

$data = array(‘uid‘=>‘uid1‘, ‘percent‘=>‘88%‘);

// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符

fwrite($client, json_encode($data)."
");

// 读取推送结果

echo fread($client, 8192);

  

后端推送消息的代码和push.php监听同一个端口

push.php和前端监听同一个websocket端口

通过后端推送消息的代码向push.php推送数据,

push.php接受到数据后通过处理 利用websocket往前端推送数据

以上就是WorkerMan中php后端及时推送消息给客户端的详细内容

更多学习内容请访问:

怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新

 

以上是关于如何在php后端及时推送消息给客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何在php后端及时推送消息给客户端

WorkerMan中php后端及时推送消息给客户端

结合实际需求,在webapi内利用WebSocket建立单向的消息推送平台,让A页面和服务端建立WebSocket连接,让其他页面可以及时给A页面推送消息

java服务器推送消息给android

c# 使用webhook推送消息给钉钉机器人

如何用java给指定的微信用户推送消息,每天早上十点推送一条消息。麻烦说的仔细一点,最好能给出实例谢谢