1 开发需要环境
工欲善其事,必先利其器。在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率。
- 安装 swoole 拓展包
- 安装 redis 拓展包
- 安装 laravel5.5 版本以上
如果你还不会用swoole就out了
2 Laravel 生成命令行
- PHP artisan make:command SwooleDemo
@H_
404_23@
class SwooleDemo extends Command
{
protected $signature = @H_502_31@'@H_502_31@swoole:demo@H_502_31@';
protected $description = @H_502_31@'@H_502_31@这是关于swoole的一个测试demo@H_502_31@';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$this->line(@H_502_31@"@H_502_31@hello world@H_502_31@");
}
}
@H_
404_23@
<?PHP
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
class SwooleDemo extends Command
{
// 命令名称
protected $signature = @H_502_31@'@H_502_31@swoole:demo@H_502_31@';
// 命令说明
protected $description = @H_502_31@'@H_502_31@这是关于swoole websocket的一个测试demo@H_502_31@';
// swoole websocket服务
private static $server = null;
public function __construct()
{
parent::__construct();
}
// 入口
public function handle()
{
$this->redis = Redis::connection(@H_502_31@'@H_502_31@websocket@H_502_31@');
$server = self::getWebSocketServer();
$server->on(@H_502_31@'@H_502_31@open@H_502_31@',[$this,@H_502_31@'@H_502_31@onOpen@H_502_31@']);
$server->on(@H_502_31@'@H_502_31@message@H_502_31@',@H_502_31@'@H_502_31@onMessage@H_502_31@']);
$server->on(@H_502_31@'@H_502_31@close@H_502_31@',@H_502_31@'@H_502_31@onClose@H_502_31@']);
$server->on(@H_502_31@'@H_502_31@request@H_502_31@',@H_502_31@'@H_502_31@onRequest@H_502_31@']);
$this->line(@H_502_31@"@H_502_31@swoole服务启动成功 ...@H_502_31@");
$server->start();
}
// 获取服务
public static function getWebSocketServer()
{
if (!(self::$server instanceof \swoole_websocket_server)) {
self::setWebSocketServer();
}
return self::$server;
}
// 服务处始设置
protected static function setWebSocketServer():void
{
self::$server = new \swoole_websocket_server(@H_502_31@"@H_502_31@0.0.0.0@H_502_31@",9502);
self::$server->set([
@H_502_31@'@H_502_31@worker_num@H_502_31@' => 1,@H_502_31@'@H_502_31@heartbeat_check_interval@H_502_31@' => 60,// 60秒检测一次
@H_502_31@'@H_502_31@heartbeat_idle_time@H_502_31@' => 121,// 121秒没活动的
]);
}
// 打开swoole websocket服务回调代码
public function onOpen($server,$request)
{
if ($this->checkAccess($server,$request)) {\
self::$server->push($request->fd,@H_502_31@"@H_502_31@打开swoole服务成功!@H_502_31@");\
}
}
// 给swoole websocket 发送消息回调代码
public function onMessage($server,$frame)
{
}
// http请求swoole websocket 回调代码
public function onRequest($request,$response)
{
}
// websocket 关闭回调代码
public function onClose($serv,$fd)
{
$this->line(@H_502_31@"@H_502_31@客户端 {$fd} 关闭@H_502_31@");
}
// 校验客户端连接的合法性,无效的连接不允许连接
public function checkAccess($server,$request):bool
{
$bRes = true;
if (!isset($request->get) || !isset($request->get[@H_502_31@'@H_502_31@token@H_502_31@'])) {
self::$server->close($request->fd);
$this->line(@H_502_31@"@H_502_31@接口验证字段不全@H_502_31@");
$bRes = false;
} else if ($request->get[@H_502_31@'@H_502_31@token@H_502_31@'] !== @H_502_31@"@H_502_31@123456@H_502_31@") {
$this->line(@H_502_31@"@H_502_31@接口验证错误@H_502_31@");
$bRes = false;
}
return $bRes;
}
// 启动websocket服务
public function start()
{
self::$server->start();
}
}