Heim > PHP-Framework > Workerman > Das PHP-Backend in WorkerMan sendet Nachrichten zeitnah an den Client

Das PHP-Backend in WorkerMan sendet Nachrichten zeitnah an den Client

Freigeben: 2020-02-08 16:39:52
nach vorne
5901 Leute haben es durchsucht

Das PHP-Backend in WorkerMan sendet Nachrichten zeitnah an den Client

Das PHP-Backend sendet Nachrichten zeitnah an den Client

Prinzip:

1. Erstellen Sie einen Websocket-Worker, um lange Clientverbindungen aufrechtzuerhalten

2. Erstellen Sie einen Text-Worker innerhalb des Websocket-Workers

3. Der Websocket-Worker und der Text-Worker sind derselbe Prozess und können bequem die Client-Verbindung teilen

4 unabhängig Das PHP-Backend-System kommuniziert mit dem Text Worker über das Textprotokoll

5. Der Text Worker betreibt die Websocket-Verbindung, um den Daten-Push abzuschließen

Code und Schritte

push.php
 
<?php
use Workerman\Worker;
require_once &#39;./Workerman/Autoloader.php&#39;;
// 初始化一个worker容器,监听1234端口
$worker = new Worker(&#39;websocket://0.0.0.0:1234&#39;);//
 
/*
 * 注意这里进程数必须设置为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(&#39;text://0.0.0.0:5678&#39;);
    $inner_text_worker->onMessage = function($connection, $buffer)
    {
        // $data数组格式,里面有uid,表示向那个uid的页面推送数据
        $data = json_decode($buffer, true);
        $uid = $data[&#39;uid&#39;];
        // 通过workerman,向uid的页面推送数据
        $ret = sendMessageByUid($uid, $buffer);
        // 返回推送结果
        $connection->send($ret ? &#39;ok&#39; : &#39;fail&#39;);
    };
    // ## 执行监听 ##
    $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(&#39;ws://127.0.0.1:1234&#39;);
ws.onopen = function(){
    var uid = &#39;uid1&#39;;
    ws.send(uid);
};
ws.onmessage = function(e){
    alert(e.data);
};
后端推送消息的代码
 
// 建立socket连接到内部推送端口
$client = stream_socket_client(&#39;tcp://127.0.0.1:5678&#39;, $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array(&#39;uid&#39;=>&#39;uid1&#39;, &#39;percent&#39;=>&#39;88%&#39;);
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
Nach dem Login kopieren

Der Code und die Schritte der Back-End-Push-Nachricht push.php lauschen auf demselben Port

push.php und das Front-End lauschen auf demselben Websocket-Port

Push-Daten zum Pushen. PHP über den Back-End-Push-Nachrichtencode

push Nachdem .php die Daten empfangen hat, verwendet es Websocket, um die Daten durch Verarbeitung an das Front-End zu übertragen

Für weitere Workerman-Kenntnisse zahlen Sie bitte Beachten Sie die Tutorial-Kolumne der chinesischen PHP-Website workerman Framework .

Das obige ist der detaillierte Inhalt vonDas PHP-Backend in WorkerMan sendet Nachrichten zeitnah an den Client. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage