我修改启动脚本如下,@walkor ,帮忙看看要怎么断开非法的请求连接呢?
<?php
use Workerman\Worker;
use Workerman\WebServer;
use Workerman\Autoloader;
use PHPSocketIO\SocketIO;
// composer autoload
include __DIR__ . '/../../vendor/autoload.php';
include __DIR__ . '/../../src/autoload.php';
$io = new SocketIO(2020);
define('USER', "randy");
define('PWD', '123');
$io->on('connection', function ($socket) use ($io) {
$socket->addedUser = false;
$socket->auth = false;
\Workerman\Lib\Timer::add(1, function () use ($socket, $io) {
if (!$socket->auth && $socket) {
unset($socket);
}
}, [], false);
$socket->on("doauth", function ($account) use ($socket) {
//do auth
$account = @json_decode($account, true);
if (!is_array($account)) {
$socket->emit("auth fail", );
unset($socket);
return;
} elseif ($account != USER || $account != PWD) {
$socket->emit("auth fail", );
unset($socket);
return;
}
$socket->auth = true;
// when the client emits 'new message', this listens and executes
$socket->on('new message', function ($data) use ($socket) {
// we tell the client to execute 'new message'
$socket->broadcast->emit('new message', array(
'username' => $socket->username,
'message' => $data
));
});
// when the client emits 'add user', this listens and executes
$socket->on('add user', function ($username) use ($socket) {
global $usernames, $numUsers;
// we store the username in the socket session for this client
$socket->username = $username;
// add the client's username to the global list
$usernames = $username;
++$numUsers;
$socket->addedUser = true;
$socket->emit('login', array(
'numUsers' => $numUsers
));
// echo globally (all clients) that a person has connected
$socket->broadcast->emit('user joined', array(
'username' => $socket->username,
'numUsers' => $numUsers
));
});
// when the client emits 'typing', we broadcast it to others
$socket->on('typing', function () use ($socket) {
$socket->broadcast->emit('typing', array(
'username' => $socket->username
));
});
// when the client emits 'stop typing', we broadcast it to others
$socket->on('stop typing', function () use ($socket) {
$socket->broadcast->emit('stop typing', array(
'username' => $socket->username
));
});
// when the user disconnects.. perform this
$socket->on('disconnect', function () use ($socket) {
global $usernames, $numUsers;
// remove the username from global usernames list
if ($socket->addedUser) {
unset($usernames);
--$numUsers;
// echo globally that this client has left
$socket->broadcast->emit('user left', array(
'username' => $socket->username,
'numUsers' => $numUsers
));
}
});
});
});
$web = new WebServer('http://0.0.0.0:2022');
$web->addRoot('localhost', __DIR__ . '/public');
Worker::runAll();
socket.io好像没有关闭链接的方法。
有个 socket.io-auth 好像是服务端直接disconnect客户端连接。不然直接部署到线上,任何非法连接不授权都可以很容易被攻击挂了,我用PHP unset socket好像连接都还在。不知道有没办法实现
@609176445 我也有这样的问题,unset socket后连接都还在,现在解决了吗。