public function onTask($server, $task_id, $from, $data) { Cli::out("Task #{$task_id} started."); $json = json_decode($data, true); foreach ($this->subscribers as $fd => $row) { if (empty($json['channel']) or empty($row['channel']) or false !== strpos(',' . $row['channel'] . ',', ',' . $json['channel'] . ',')) { $this->server->push($fd, $data); } } return true; }
/** * 接受消息时 * * @param swoole_websocket_server $server * @param $frame * @author yangyifan <*****@*****.**> */ public function onMessage(swoole_websocket_server $server, $frame) { //组合数据 $data = json_decode($frame->data, true); $data['time'] = date('Y-m-d H:i:s'); $server->push($data['id'], json_encode($data)); }
<?php $ws = new swoole_websocket_server("0.0.0.0", 9600); $ws->on('open', function ($ws, $request) { $ws->push($request->fd, "hello, welcome\n"); }); $ws->on('message', function ($ws, $frame) { echo "Message: {$frame->data}\n"; $ws->push($frame->fd, "server: {$frame->data}"); }); $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; }); $ws->start();
*/ function callback_vmstat(swoole_process $worker) { global $table; $vmstat = $table->get('vmstat'); $cmd = $vmstat['cmd']; $interval = $vmstat['interval']; $count = $vmstat['count']; $worker->exec($cmd, array($interval, $count)); } /** * 当WebSocket客户端与服务器建立连接并完成握手后会回调此函数。 */ $server->on('open', function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd}\n"; $server->push($request->fd, "procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----\n"); $server->push($request->fd, "r b swpd free buff cache si so bi bo in cs us sy id wa\n"); }); /** * 当服务器收到来自客户端的数据帧时会回调此函数。 */ $server->on('message', function (swoole_websocket_server $server, $frame) { // echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; // $server->push($frame->fd, "this is server"); }); /** * 当客户端关闭的时候调用 */ $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; });
$request = json_decode($frame->data, true); print_r($request); $cmd = $request['cmd']; $data = $request['data']; switch ($cmd) { case 'login': $uid = 'uid_' . $frame->fd; $redis->lpush('uid_list', $frame->fd); $username = $data['username']; $redis->set($uid, $username); $user_list = get_online_users($redis); $response = ['cmd' => 'login', 'data' => ['user' => $username, 'user_list' => $user_list]]; $response_data = json_encode($response); //通知新用户登录 foreach ($serv->connections as $fd) { $serv->push($fd, $response_data); } break; case 'send_msg': $username = $data['from']; $send_to = $data['send_to']; $content = $data['content']; $color = $data['color'] ?? ''; $font_size = $data['font_size'] ?? ''; $response = ['data' => ['from' => $username, 'content' => $content, 'color' => $color, 'font_size' => $font_size]]; echo 888; //to all if ($send_to == 0) { $response['cmd'] = 'send_to_all'; $response_data = json_encode($response); foreach ($serv->connections as $fd) {
<?php $server = new swoole_websocket_server("0.0.0.0", 8080); $server->on('message', function (swoole_websocket_server $server, $frame) { foreach ($server->connection_list() as $fd) { $server->push($fd, $frame->data, true); } }); $server->start();
$str = str_replace('load average:', '', $str); $str = $nowtime . ',' . $str; $serv->push($fd, $str); } } } }); } }); /** * 当WebSocket客户端与服务器建立连接并完成握手后会回调此函数。 */ $server->on('open', function (swoole_websocket_server $server, $request) { $fd = $request->fd; echo "server: handshake success with fd{$fd}\n"; $server->push($fd, "nowtime -----------Linetime---------- ---users-- -----load average----\n"); $server->push($fd, "nowtime,days,time,users,one,five,fifteen\n"); }); /** * 当服务器收到来自客户端的数据帧时会回调此函数。 */ $server->on('message', function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $server->push($frame->fd, "this is server"); }); /** * 当客户端关闭的时候调用 */ $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; });
$hash = md5($cb_pass . $cb_name); //if fd is 1, the server had been restarted if ($request->fd == 1) { hash_clear($redis); } var_dump($hash, $request->fd); //save $fd => $hash if ($redis->hGet('fd.to.hash', $request->fd) != $hash) { $redis->hSet('fd.to.hash', $request->fd, $hash); } //save $hash => $fd, this list be used to publish msg on the channel. $redis->lPush('publish_' . $hash, $request->fd); $all = $redis->lRange($hash, 0, -1); $all = array_reverse($all); $result = array('type' => 'all', 'data' => $all); $ws->push($request->fd, json_encode($result)); }); $ws->on('message', function ($ws, $frame) { global $redis; $hash = $redis->hGet('fd.to.hash', $frame->fd); $r = json_decode($frame->data, true); if (empty($r)) { return; } $msg = $r['msg']; if ($msg === '') { return; } switch ($r['type']) { case 'message': save_cb($redis, $hash, $msg);
<?php $map = []; $server = new swoole_websocket_server("0.0.0.0", 9501); $server->on('open', function (swoole_websocket_server $server, $request) use(&$map) { var_dump($request); echo "server: handshake success with fd{$request->fd}\n"; $map[$request->fd] = $request->fd; }); $server->on('message', function (swoole_websocket_server $server, $frame) use(&$map) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; // var_dump($map); foreach ($map as $id => $value) { $server->push($id, "this is server, " . $frame->data); } }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->start();
public function actionSwooleserver() { $host = '0.0.0.0'; $port = 9501; $server = new \swoole_websocket_server($host, $port); $server->on('open', function (\swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd} \n"; }); $server->on('message', function (\swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $key = $frame->data; $reply = 'this is swoole server: your key=' . $key; //Yii::log('serializer='.Yii::$app->cache->serializer);// yii 对memcache的value序列化存储了 $listOri = Yii::$app->cache->get($key); //$this->keyAdd; $list = @json_decode($listOri, true); //print_r($list); $data = ['code' => 0, 'msg' => 'ok', 'data' => ['reply' => $reply, 'total' => count($list), 'list' => $list]]; $server->push($frame->fd, json_encode($data)); }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->start(); echo "swolle server start by {$host}:{$port}\n"; }
$server->on('WorkerStart', function (swoole_websocket_server $server, $worker_id) { G::$inotify = inotify_init(); swoole_event_add(G::$inotify, function ($ifd) use($server) { $events = inotify_read(G::$inotify); if (!$events) { return; } foreach ($events as $event) { $filename = G::$watchList[$event['wd']]; $line = fgets(G::$files[$filename]['fp']); if (!$line) { echo "fgets failed\n"; } //遍历监听此文件的所有用户,进行广播 foreach (G::$files[$filename]['users'] as $fd) { $server->push($fd, $line); } } }); }); $server->on('Message', function (swoole_websocket_server $server, $frame) { echo "message: " . $frame->data; $result = json_decode($frame->data, true); $filename = $result['filename']; //以文件名作为数组的值,Key是fd $filename = __DIR__ . '/' . $filename; if (!is_file($filename)) { $server->push($frame->fd, "file[{$filename}] is not exist.\n"); return; } //还没有创建inotify句柄
//创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0", 9502); //监听WebSocket连接打开事件 $ws->on('open', function ($ws, $request) { var_dump($request->fd, $request->get, $request->server); $start_fd = 0; while (true) { $conn_list = $ws->connection_list($start_fd, 10); if ($conn_list === false or count($conn_list) === 0) { echo "finish\n"; break; } $start_fd = end($conn_list); var_dump($conn_list); foreach ($conn_list as $fd) { $ws->push($fd, "消息: " . $request->fd . "来到了房间"); } } }); //监听WebSocket消息事件 $ws->on('message', function ($ws, $frame) { echo "Message: {$frame->data}\n"; $start_fd = 0; while (true) { $conn_list = $ws->connection_list($start_fd, 10); if ($conn_list === false or count($conn_list) === 0) { echo "finish\n"; break; } $start_fd = end($conn_list); var_dump($conn_list);
<?php $server = new swoole_websocket_server("", 9501); $server->on('open', function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd}\n"; }); $server->on('message', function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $conn_list = $server->connection_list(); //var_dump($conn_list); 广播 foreach ($conn_list as $fd) { $server->push($fd, "from: client{$frame->fd}, content: " . $frame->data); } //$server->push($frame->fd, "from: client{$fd}, content: ".$frame->data); }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->start();
define('CONTENT_MAXLEN', 500); //创建websocket服务器对象,监听127.0.0.1:9009端口 $ws = new swoole_websocket_server("127.0.0.1", 9009); //机器人类 $robot = new Robot(); //在线用户详情记录 $table = new swoole_table(1024 * 10); $table->column('name', swoole_table::TYPE_STRING, 16); $table->column('fd', swoole_table::TYPE_INT); $table->column('dateline', swoole_table::TYPE_INT); $table->column('avatar', swoole_table::TYPE_INT); $table->column('ip', swoole_table::TYPE_STRING, 16); $table->create(); $ws->table_user = $table; $ws->on('open', function ($ws, $request) { $ws->push($request->fd, jsonResult('open', SUCCESS_CODE, "连接成功!\n")); }); $frames_data = array(); $ws->on('message', function ($ws, $frame) { global $robot, $frames_data; $frames_data[$frame->fd] = isset($frames_data[$frame->fd]) ? $frames_data[$frame->fd] : ''; $frames_data[$frame->fd] .= $frame->data; if ($frame->finish) { $json = $frames_data[$frame->fd]; $msg = json_decode($json, true); unset($frames_data[$frame->fd]); if (JSON_ERROR_NONE == json_last_error()) { $act = $msg['action']; switch ($act) { case 'login': //用户登录
<?php $serv = new swoole_websocket_server('0.0.0.0', 9501); $serv->on('Request', function ($req, $resp) { if ($req->server['request_uri'] == '/camera') { $html = file_get_contents(__DIR__ . '/camera.html'); } else { $html = file_get_contents(__DIR__ . '/index.html'); } $resp->end($html); }); $serv->on('Message', function ($serv, $frame) { $connections = $serv->connection_list(); foreach ($connections as $fd) { $info = $serv->connection_info($fd); if ($fd != $frame->fd and $info['websocket_status'] > 1) { $serv->push($fd, $frame->data); } } }); $serv->start();
* websocket server start * 成功后回调 */ $server->on('start', function ($serv) use($_maxMasterPidLength, $_maxManagerPidLength, $_maxWorkerIdLength, $_maxWorkerPidLength) { echo "[1A\n[K-----------------------[47;30m SWOOLE [0m-----------------------------\n[0m"; echo 'swoole version:' . swoole_version() . " PHP version:" . PHP_VERSION . "\n"; echo "------------------------[47;30m WORKERS [0m---------------------------\n"; echo "[47;30mMasterPid[0m", str_pad('', $_maxMasterPidLength + 2 - strlen('MasterPid')), "[47;30mManagerPid[0m", str_pad('', $_maxManagerPidLength + 2 - strlen('ManagerPid')), "[47;30mWorkerId[0m", str_pad('', $_maxWorkerIdLength + 2 - strlen('WorkerId')), "[47;30mWorkerPid[0m", str_pad('', $_maxWorkerPidLength + 2 - strlen('WorkerPid')), "\n"; }); /** * 当WebSocket客户端与服务器建立连接并完成握手后会回调此函数。 */ $server->on('open', function (swoole_websocket_server $server, $request) { $fd = $request->fd; echo "server: handshake success with fd{$fd}\n"; $server->push($fd, "Mem -----------Swap---------\n"); $server->push($fd, "total used free shared buff/cache available Total Used Free\n"); }); /** * 当服务器收到来自客户端的数据帧时会回调此函数。 */ $server->on('message', function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $server->push($frame->fd, "this is server"); }); /** * 当客户端关闭的时候调用 */ $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; });