我是靠谱客的博主 清秀雪碧,最近开发中收集的这篇文章主要介绍如何在php后端及时推送消息给客户端,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用以下代码可以更改设置。

后端代码push.php<?phpuse WorkermanWorker;require_once './Workerman/Autoloader.php';

$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){// 判断当前客户端是否已经验证,既是否设置了uidif(!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

>>>>>>>>>>>>>>>>>>>>>>>

后端代码


push.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
use  WorkermanWorker;
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);
};

后端推送消息的代码

1
2
3
4
5
6
7
8
// 建立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

以上代码亲测可以直接使用


最后

以上就是清秀雪碧为你收集整理的如何在php后端及时推送消息给客户端的全部内容,希望文章能够帮你解决如何在php后端及时推送消息给客户端所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部