PHPはWebsocketサーバを構築するためにワーカーマンを使用してWebsocket登録を実現します.
4378 ワード
laravelを使用しているので、アーティストを使ってサービスを作成したり、他のファイルを使って作成したり、直接phpコマンドで実行したり、ブログPHPを参照してワーカーマンを使ってバックエンドメッセージをプッシュしてフロントエンドを実現したり、WeChat登録を完了したら、先にこちらのブログを読んでください.読者に全体のプッシュプロセスを理解するのに役立ちます.コードは以下の通りです. プロジェクトのルートディレクトリに入って、起動して、接続php arsian websocket start を待ちます.
argument('action');
$argv[1] = $argv[2];
$argv[2] = isset($argv[3]) ? "-{$argv[3]}" : '';
switch ($arg) {
case 'start':
$this->start();
break;
case 'stop':
break;
case 'restart':
break;
case 'reload':
break;
case 'status':
break;
case 'connections':
break;
}
}
private function start(){
// websocket , , websocket
$this->worker = new Worker('websocket://0.0.0.0:18888');
//
$this->worker->uidConnections = [];
$this->worker->count = 1;
$this->worker->onWorkerStart = function ($worker) {
// , , php
$inner_text_worker = new Worker('tcp://0.0.0.0:18889');
$inner_text_worker->onMessage = function ($connection, $buffer) {
Log::alert('workerman inner accept message : ' . $buffer);
$data = json_decode($buffer, true);
$uid = $data['scene'];
$token = $data['token'];
//
$res = $this->sendMessageByUid($uid, $token);
Log::alert('workerman reply message to uid : '. $uid .'..$openid..'. $token);
$mess = $res ? 'ok' : 'fail';
Log::alert('workerman reply message : ' . $mess);
// php
$connection->send($mess);
};
$inner_text_worker->listen();
};
$this->worker->onMessage = function ($connection, $data) {
Log::alert('workerman accept browser data : ' . $data);
if (!isset($connection->uid)) {
$connection->uid = $data;
$this->worker->uidConnections[$connection->uid] = $connection;
return;
}
};
$this->worker->onClose = function ($connection) {
if (isset($connection->uid)) {
Log::alert('workerman close browser : ' . $connection->uid);
unset($this->worker->uidConnections[$connection->uid]);
}
};
Worker::runAll();
}
/**
*
* @param $message
*/
private function broadCast($message)
{
global $worker;
foreach ($worker->uidConnections as $connection) {
$connection->send($message);
}
}
private function sendMessageByUid($uid, $message)
{
Log::alert(json_encode($this->worker->uidConnections));
if (isset($this->worker->uidConnections[$uid])) {
$connection = $this->worker->uidConnections[$uid];
$connection->send($message);
return true;
}
return false;
}
}
アプリ/Consolie/Kernel.phpに登録するprotected $commands = [
//
WebsocketServer::class,
];