首页 > 后端开发 > 正文

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

2024-10-01 23:20:26 | 我爱编程网

小编今天整理了一些如何在php后端及时推送消息给客户端相关内容,希望能够帮到大家。

本文目录一览:

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

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

后端代码
push.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

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

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

PHP数组:什么是数组

分为这几类
1、添加数组元素
PHP是一种弱类型语言,这意味着你不需要显示声明一个数组及其大小,相反,你可以同时声明并填充数组。

$capitals = array(
'Alabama' => 'Montgomery',
'Alaska' =>
'Juneau',
'Arizona' => 'Phoenix'
); 额外的数组元素可以象下面这样追加:

$capitals['Arkansas'] = 'Little Rock';
如果你正在处理数字索引数组,你可能想使用显示命名的函数前置和追加元素,如array_push()和array_unshift()函数,但这些函数不能操作关联数组。

2、删除数组元素
如果要从数组中删除一个元素,请使用unset()函数,如:

unset($capitals['California']);
使用数字索引数组时,删除数组元素的办法更多,更灵活,可以使用array_shift()和array_pop()函数分别从数组的开头和末尾删除一个元素。

3、交换键和值

假设你想创建一个名叫$states的新数组,使用州府作为索引,使用州名作为关联值,使用array_flip()函数很容易完成这个任务。

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

PHP中的常用数组操作方法有哪些

我爱编程网(https://www.52biancheng.com)小编还为大家带来PHP中的常用数组操作方法有哪些的相关内容。

PHP中的常用数组操作方法(每种都给你举个2个例子)

一、数组操作的基本函数

数组的键名和值

array_values($arr);  获得数组的值

array_keys($arr);  获得数组的键名

数组的内部指针

current($arr);  返回数组中的当前单元

pos($arr);  返回数组中的当前单元

数组和变量之间的转换 我爱编程网

extract($arr);用于把数组中的元素转换成变量导入到当前文件中,键名当作变量名,值作为变量值

注:(第二个参数很重要,可以看手册使用)使用方法

echo $a;compact(var1,var2,var3);用给定的变量名创建一个数组

二、数组的分段和填充

数组的分段

array_slice($arr,0,3);  可以将数组中的一段取出,此函数忽略键名

array_splice($arr,0,3,array("black","maroon"));  可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除

分割多个数组

array_chunk($arr,3,TRUE);  可以将一个数组分割成多个,TRUE为保留原数组的键名

数组的填充

array_pad($arr,5,'x');  将一个数组填补到制定长度

三、数组与栈

array_push($arr,"apple","pear");  将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数

array_pop($arr);  将数组栈的最后一个元素弹出(出栈)

四、数组与列队

array_shift($arr);数组中的第一个元素移出并作为结果返回(数组长度减1,其他元素向前移动一位,数字键名改为从零技术,文字键名不变)

array_unshift($arr,"a",array(1,2));在数组的开头插入一个或多个元素

五、回调函数

array_walk($arr,'function','words');  使用用户函数对数组中的每个成员进行处理(第三个参数传递给回调函数function)

array_mpa("function",$arr1,$arr2);  可以处理多个数组(当使用两个或更多数组时,他们的长度应该相同)

六、数组的排序

通过元素值对数组排序

sort($arr);  由小到大的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序

rsort($arr);  由大到小的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序

通过键名对数组排序

ksort($arr);  按照键名正序排序

krsort($arr);  按照键名逆序排序

七、数组的计算

数组元素的求和

array_sum($arr);  对数组内部的所有元素做求和运算

数组的合并

array_merge($arr1,$arr2);  合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面)

“+”$arr1+$arr2;  对于相同的键名只保留后一个

数组的差集

array_diff($arr1,$arr2);  返回差集结果数组

array_diff_assoc($arr1,$arr2,$arr3);  返回差集结果数组,键名也做比较

数组的交集

array_intersect($arr1,$arr2);  返回交集结果数组

array_intersect_assoc($arr1,$arr2);  返回交集结果数组,键名也做比较

八、其他的数组函数

range(0,12);  创建一个包含指定范围单元的数组

array_unique($arr);  移除数组中重复的值,新的数组中会保留原始的键名

以上就是我爱编程网小编为大家带来的内容了,想要了解更多相关信息,请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“如何在php后端及时推送消息给客户端”相关推荐
如何在spark基础二次开发基于java swing的pc客户端
如何在spark基础二次开发基于java swing的pc客户端

如何在spark基础二次开发基于javaswing的pc客户端packageorg.jivesoftware.spark.ui;importjava.util.ArrayList;importorg.jivesoftware.spark.util.log.Log;importorg.jivesoftware.spark.util.ModelUtil;importorg.j

2024-04-28 06:38:45
jsp中request.getHeader()获取客户端的各种信息,那php中什么方法来获取
jsp中request.getHeader()获取客户端的各种信息,那php中什么方法来获取

thinkphprequest和param的区别request默认可以接受$_GET,$_POST和$_COOKIE(这是php内置的),$_REQUEST(超全局变量),只是把值获取到,但并不判断是什么类型的数据。param是thinkphp自己的类型,自动判断是什么类型的数据,接收即可。无论什么类型都可以接受,包括php://input这种原生数据流。php中get和reques

2024-09-24 01:24:31
php返回文件流给前端(php返回值)(php是前端还是后端)
php返回文件流给前端(php返回值)(php是前端还是后端)

php返回文件流给前端(php返回值)php怎么发送http请求并接收返回值PHP可以通过内置的函数和扩展来响应客户端发送的HTTP请求,下面是一些常用的方式:使用原生的PHPHTTP函数:PHP提供了一些原生的HTTP函数,如header()、setcookie()、http_response_code()等,可以使用这些函数来响应HTTP请求。可以使用curl_系列函数,使用c

2024-12-23 09:10:09
php是前端还是后端 php是前端还是后端
php是前端还是后端 php是前端还是后端

php是前端还是后端该脚本语言是一种后端编程语言。在Web开发中,php主要在服务器端执行,用来处理HTTP请求、与数据库交互(如MySQL)、进行服务器端逻辑运算以及生成动态内容等任务。php脚本嵌入到HTML文件中,并由服务器解析和执行,后将结果以HTML、XML或JSON格式返回给客户端(浏览器)。php是前端还是后端PHP代码是主要运行在服务器端的,所以可称为后端。

2024-09-08 23:34:52
php文件怎么在浏览器运行(php程序文件在客户端浏览器中执行)
php文件怎么在浏览器运行(php程序文件在客户端浏览器中执行)

php文件怎么在浏览器运行(php程序文件在客户端浏览器中执行)Apache需要将php文件交给PHP解释器处理后再返回给浏览器,那PHP如何运行的呢?1.我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;2.PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);3.PHP总共有三个模块:内核、Zend引

2024-11-25 12:23:02
python如何在终端退出
python如何在终端退出

3、终端进入和退出python编辑模式1、MAC默认已安装python2.6版本,若想启动该版本,直接输入python即可进入。2、若已安装最新版本,比如3.7,则输入python3,即可进入。3、若想不关闭终端退出,则输入命令"exit()",或者“quit()”,或者按“control+d”。Python入门题039:强制退出程序(5种方法)在一个死循环中,不使用ret

2023-12-11 19:45:48
php后端函数开发 php前端开发和php后端开发的区别?
php后端函数开发 php前端开发和php后端开发的区别?

php是写后端还是前端的语言?php是前端还是后端php属于后端。php(全称php:HypertextPreprocessor,即“php:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。后端。这里的前端是指的为访问者服务为目的的应用,后端是管理、运营、数据挖掘等非面向访问者的东西。PHP是属于后端开发,不过PHP除了开发后台功能

2025-01-24 21:47:07
如何在ubuntu终端运行python脚本
如何在ubuntu终端运行python脚本

ubuntu下用python写了个生成动态壁纸的脚本,如果通过代码实现使用这个xml,而不是通过桌面->背景->添加sudomkdir/usr/share/backgrounds/mybackground-imgssudocd/usr/share/backgrounds/mybackground-imgssudocp/home/你的背景图片所在目录/*.sudo./backgro

2024-01-06 04:45:15