PHP code example of devweyes / ws-server-cluster
1. Go to this page and download the library: Download devweyes/ws-server-cluster library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
devweyes / ws-server-cluster example snippets
return [
Cluster::MANAGER => [ //主配置
'class' => ClusterManager::class,
'state' => bean(Cluster::STATE), //状态选择
'onHandshakeMiddleware' => [ //握手阶段中间键
bean(DefaultAllowMiddleware::class)
],
'onOpenMiddleware' => [ //onOpen阶段中间键
bean(DefaultAuthMiddleware::class)
],
'heartbeat' => 60 //服务器心跳检测,相互检测
],
Cluster::STATE => [ //状态保存配置
'class' => RedisState::class,
'redis' => bean('redis.pool'),
'serializer' => bean(Cluster::SERIALIZER),
'prefix' => 'swoft_ws_server_cluster',
],
Cluster::SERIALIZER => [ //序列化配置
'class' => PhpSerializer::class
]
];
use Jcsp\WsCluster\Helper\Tool;
...
'wsServer' => [
'class' => \Swoft\WebSocket\Server\WebSocketServer::class,
...
//可配置多个消息消费,视业务量而定
'process' => array_merge(
Tool::moreProcess('recvMessageProcess', bean(\Jcsp\WsCluster\Process\RecvMessageProcess::class), 3),
[
//自定义进程
]
)
]
...
···
'wsMsgDispatcher' => [
'preMiddlewares' => [
\Jcsp\WsCluster\Middleware\RecvMessageMiddleware::class
]
],
···
namespace Jcsp\WsCluster\Middleware;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Http\Message\Request;
use Swoft\Http\Message\Response;
/**
* @Bean()
* Class DefaultAllowMiddleware
* @package Jcsp\WsCluster\Middleware
*/
class DefaultAllowMiddleware extends AbstracHandshakeMiddleware
{
/**
* @param Request $request
* @param int $fd
*/
public function before(Request $request, Response $response)
{
if(!$request->getHeaderLine('auth')) {
//return [false, $response];
}
return [true, $response->withAttribute('allow','true')];
}
/**
* @param Request $request
* @param int $fd
*/
public function after(Request $request, Response $response)
{
}
}
namespace Jcsp\WsCluster\Middleware;
use Jcsp\WsCluster\Cluster;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Http\Message\Request;
/**
* @Bean()
* Class DefaultAuthMiddleware
* @package Jcsp\WsCluster\Handle
*/
class DefaultAuthMiddleware extends AbstractOpenMiddleware
{
/**
* @param Request $request
* @param int $fd
*/
public function before(Request $request, int $fd)
{
//token解析+用户绑定
$auth = $request->getHeaderLine('auth');
if ($auth) {
Cluster::register($fd, $this->decodeToken($auth));
}
}
/**
* @param Request $request
* @param int $fd
*/
public function after(Request $request, int $fd)
{
//出
}
private function decodeToken(string $auth)
{
return $auth;
}
}
//对绑定的uid精准推送,@onOpen中间键绑定
Cluster::transport(string $message, $uid = null)
Cluster::transportToUid(string $message, ...$uid)
//对所有在役服务端的客户端广播消息
Cluster::transportToAll(string $message)
return [false, $response]
$response