我現(xiàn)在做一個項目,客戶端已經鏈接上了,并且能發(fā)送數(shù)據,但是要接受數(shù)據返回只是在發(fā)送數(shù)據后可以接受。我發(fā)現(xiàn)客戶端建立的是一個長鏈接,那是否可以我PHP程序這邊外部調用一個方法,向已知workerID和connectID的連接發(fā)送數(shù)據過去呢?
如果是多進程Worker,
可以使用Chnnel組件,完成進程間/服務器集群通訊。
Chnnel組件可以方便的做到進程間通訊,非阻塞IO,基于訂閱發(fā)布模式
Channel組件地址:https://github.com/walkor/Channel
測試代碼如下
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';
// 初始化一個Channel服務端
$channel_server = new Channel\Server('0.0.0.0', 2206);
// websocket服務端
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->count=2;
// 進程啟動后連接Channel服務端
$worker->onWorkerStart = function($worker)
{
// Channel客戶端連接到Channel服務端
Channel\Client::connect('127.0.0.1', 2206);
// 當前進程訂閱workerID的消息
Channel\Client::subscribe($worker->id);
// 當前workerID有消息時觸發(fā)的回調
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ù)據
$to_connection = $worker->connections;
$to_connection->send($message);
};
};
// 客戶端連接上來時打印發(fā)送當前workerID和connectionID
$worker->onConnect = function($connection)use($worker)
{
$msg = "workerID:{$worker->id} connectionID:{$connection->id} connected\n";
echo $msg;
$connection->send($msg);
};
/*
* 用來處理http請求,通過http請求向任意客戶端推送數(shù)據,需要傳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');
// 進程啟動后連接channel服務端
$http_worker->onWorkerStart = function()
{
Channel\Client::connect('127.0.0.1', 2206);
};
// 收到http請求時向對應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();
如果是單進程Worker
可以參考手冊
http://doc.workerman.net/faq/send-data-to-client.html
參考這個
http://doc.workerman.net/346075
send_to_group 和 send_to_uid 實現(xiàn)方式是一樣的