国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

能否外部調(diào)用某一個(gè)進(jìn)程(connect)向與workerman建立長鏈接的客戶端發(fā)送數(shù)據(jù)

fourswall

我現(xiàn)在做一個(gè)項(xiàng)目,客戶端已經(jīng)鏈接上了,并且能發(fā)送數(shù)據(jù),但是要接受數(shù)據(jù)返回只是在發(fā)送數(shù)據(jù)后可以接受。我發(fā)現(xiàn)客戶端建立的是一個(gè)長鏈接,那是否可以我PHP程序這邊外部調(diào)用一個(gè)方法,向已知workerID和connectID的連接發(fā)送數(shù)據(jù)過去呢?

5062 3 0
3個(gè)回答

walkor 打賞

如果是多進(jìn)程Worker,
可以使用Chnnel組件,完成進(jìn)程間/服務(wù)器集群通訊。
Chnnel組件可以方便的做到進(jìn)程間通訊,非阻塞IO,基于訂閱發(fā)布模式
Channel組件地址:https://github.com/walkor/Channel

測(cè)試代碼如下
start.php

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\Connection;
require_once './Workerman/Autoloader.php';
require_once './Channel/src/Server.php';
require_once './Channel/src/Client.php';

// 初始化一個(gè)Channel服務(wù)端
$channel_server = new Channel\Server('0.0.0.0', 2206);

// websocket服務(wù)端
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->count=2;

// 進(jìn)程啟動(dòng)后連接Channel服務(wù)端
$worker->onWorkerStart = function($worker)
{
    // Channel客戶端連接到Channel服務(wù)端
    Channel\Client::connect('127.0.0.1', 2206);
    // 當(dāng)前進(jìn)程訂閱workerID的消息
    Channel\Client::subscribe($worker->id);
    // 當(dāng)前workerID有消息時(shí)觸發(fā)的回調(diào)
    Channel\Client::$onMessage = function($channel, $data)use($worker){
        $to_connection_id = $data;
        $message = $data;
        if(!isset($worker->connections))
        {
            echo "connection not exsits\n";
            return;
        }
        // 向客戶端推送數(shù)據(jù)
        $to_connection = $worker->connections;
        $to_connection->send($message);
    };
};

// 客戶端連接上來時(shí)打印發(fā)送當(dāng)前workerID和connectionID
$worker->onConnect = function($connection)use($worker)
{
    $msg = "workerID:{$worker->id} connectionID:{$connection->id} connected\n";
    echo $msg;
    $connection->send($msg);
};

/*
 * 用來處理http請(qǐng)求,通過http請(qǐng)求向任意客戶端推送數(shù)據(jù),需要傳to_worker_id和to_connection_id
 * url類似http://127.0.0.1:4237/?to_connection_id=3&to_worker_id=1&content=hello
 */
$http_worker = new Worker('http://0.0.0.0:4237');
// 進(jìn)程啟動(dòng)后連接channel服務(wù)端
$http_worker->onWorkerStart = function()
{
    Channel\Client::connect('127.0.0.1', 2206);
};
// 收到http請(qǐng)求時(shí)向?qū)?yīng)worker_id的訂閱者發(fā)布消息
$http_worker->onMessage = function($connection, $data)
{
    $connection->send('ok');
    if(empty($_GET)) return;
    $to_worker_id = $_GET;
    $to_connection_id = $_GET;
    $content = $_GET;
    Channel\Client::publish($to_worker_id, array(
       'to_connection_id' => $to_connection_id,
       'content'          => $content
    ));
};

Worker::runAll();

如果是單進(jìn)程Worker
可以參考手冊(cè)
http://doc.workerman.net/faq/send-data-to-client.html

  • 暫無評(píng)論
詹少

這個(gè)例子我看過 但是如果是管理后臺(tái)向指定用戶發(fā)送消息怎么辦 無法獲取用戶的worker_id呀

  • 暫無評(píng)論
walkor 打賞

參考這個(gè)
http://doc.workerman.net/346075
send_to_group 和 send_to_uid 實(shí)現(xiàn)方式是一樣的

  • 暫無評(píng)論
年代過于久遠(yuǎn),無法發(fā)表回答
??