Home >PHP Framework >Workerman >How to push back-end messages to the front-end in workerman in real time
During the development process, we often encounter the following situation. The front-end list displays the data in the back-end database, but when a piece of data is inserted into the database in a certain interface in the back-end, the database has been updated, but the front-end display data has not been updated and needs to be refreshed manually. But it is too troublesome to update manually every time. At this time, Workerman can be used to solve the problem.
Workerman Framework is an open source high-performance PHP socket server framework developed purely in PHP. It is widely used in the development of mobile apps, mobile communications, WeChat applets, mobile game servers, online games, PHP chat rooms, hardware communications, smart homes, Internet of Vehicles, Internet of Things and other fields. Supports TCP long connections, supports Websocket, HTTP and other protocols, and supports custom protocols. It has many high-performance components such as asynchronous Mysql, asynchronous Redis, asynchronous Http, asynchronous message queue, etc.
So how should we use it to solve the above problems?
1. The front and back ends establish long websocket connections for pushing messages to each other
2. The back end establishes a listening process (no protocol restrictions)
3. After the interface successfully inserts data into the database, the data will be pushed to the internal listening port
4. After receiving the push message from the internal listening port, the backend will push the data to the frontend Push messages through websocket to achieve refresh
After downloading the source code of the workerman framework, let's implement the above process.
Implementation code:
server.php
<?php use Workerman\Worker; require_once __DIR__ . '/../../vendor/autoload.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();
push.php
<?php //插入数据库操作 // 建立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)."\n"); // 读取推送结果 echo fread($client, 8192); ?>
clien.html
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <script> 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); console.log(e.data); //window.location.reload(); }; </script> </body> </html>
Running process:
Open cmd and run server.php
Open the front-end page and console
Open a cmd and run push.php
At this time, while viewing the front-end page, the console received the message.
For more workerman knowledge, please pay attention to the workerman tutorial column on the PHP Chinese website.
The above is the detailed content of How to push back-end messages to the front-end in workerman in real time. For more information, please follow other related articles on the PHP Chinese website!