项目作者: snailzed

项目描述 :
swoole game server
高级语言: PHP
项目地址: git://github.com/snailzed/SwooleGameServer.git
创建时间: 2019-06-27T15:10:04Z
项目社区:https://github.com/snailzed/SwooleGameServer

开源协议:

下载


常驻内存框架实现逻辑

  • 1、命令行参数解析(command parse)

    就是解析$argv这个全局参数,app:start,app:stop,app:reload,app:status

  • 2、初始化设置:如日志目录、临时目录以及pid存放目录

    is_dir()
    pathinfo()
    file_exists()
    mkdir()

  • 3、注册全局的错误处理函数、异常处理函数和应用关闭函数、日志处理、配置文件处理

    set_error_handle()
    set_exception_handle()
    register_shutdown_function()

  • 4、解析配置文件,注册相关回调函数

    加载对应的配置文件,注册相关事件回调函数

  • 5、添加自定义进程

    启动server前,添加自定义进程

  • 6、添加自定义任务

    任务可以是匿名函数或者一个类

  • 7、启动|关闭|重启 server

    php bin/server app:start

php bin/server app:stop

php bin/server app:reload

php bin/server app:status

  • 8、组件开发:如连接池、配置解析类、http组件库(验证)、自定义session

Swoole Game Server

swoole websocket server

命令行

  1. 启动: php bin/server app:start
  2. 停止: php bin/server app:stop
  3. 重启: php bin/server app:reload
  4. todo php bin/server app:status

websocket通信格式(server.php可配置打包解包函数,支持json和msgpack)

  1. 发送命令:{"c":"命令,注解定义" , "d":{请求参数}}
  2. eg:{"c":1 ,"d":{"id":1}}
  3. websocket类需继承 |gs\WebsocketController,可以使用 `$this->request->getParam()`获取参数,使用 $this->getUid()获取绑定的UID

特性

  1. 1、协程http请求
  2. 2、协程webscoket
  3. 3、异步、同步 单|多task,支持闭包
  4. 4、自定义进程
  5. 5redisdb连接池
  6. 6、多语种
  7. 7、注解路由、注解task、注解进程、注解websocket命令

task组件

  • gs\swoole\Task::async($name, array $data, int $taskWorkerId = -1)
  1. 异步任务,必须设置onfinish回调,返回task_worker_id
  2. $name: 可以是定义的task任务名,使用Task注解的name属性定义;也可以是一个闭包函数
  3. $data: 调用任务类的handle方法的参数列表;调用闭包的参数列表
  4. $taskWorkerId 指定到哪个task worker执行
  • gs\swoole\Task::sync($name, array $data, $timeout = 0.5, int $taskWorkerId = -1)
  1. 同步任务,必须设置onfinish回调,返回task_worker_id
  2. $name: 可以是定义的task任务名,使用Task注解的name属性定义;也可以是一个闭包函数
  3. $data: 调用任务类的handle方法的参数列表;调用闭包的参数列表
  4. $taskWorkerId 指定到哪个task worker执行
  • gs\swoole\Task::asyncMulti(array $tasks, $timeout = 0.5)
  1. 并发执行多个task异步任务
  2. $name: [ ['任务名|匿名函数', [参数列表] ]
  3. 必须是一个数组,数组有且只有两个元素,第一个元素必须为任务名或者匿名函数,第二个元素必须为参数列表数组
  • gs\swoole\Task::coMulti(array $tasks, $timeout = 0.5)
  1. 并发执行Task并进行协程调度 ,任务完成或超时,返回结果数组。结果数组中每个任务结果的顺序与$tasks对应,某个任务执行失败或超时,对应的结果数组项为false
  2. $name: [ ['任务名|匿名函数', [参数列表] ]
  3. 必须是一个数组,每个元素是一个数组,每个数组有且只有两个元素,第一个元素必须为任务名或者匿名函数,第二个元素必须为参数列表数组
  • 使用注解定义task

    必须设置handle静态方法,使用名字来调用时,task进程就是调用该静态方法

    ```php
    <?php

namespace app\task;

use gs\annotation\Task;

/**

  • Class Test
  • @package app\task
  • @Task(name=”test”)
    */
    class Test
    {
    //必须要有handle方法
    public static function handle($hi)
    {
    1. var_dump($hi);
    }
    }

// 使用

gs\swoole\Task::async(‘test’,[‘hi snailZED!’]);

  1. ## 自定义进程
  2. > 自定义进程必须要阻塞运行,比如使用while(true)死循环,否则进程一旦退出了,swoole会自动启动一个新的进程,如此反复。
  3. 一般用来做消费者,如rabbitmq消费者,发布订阅模式等等。
  4. - 自定义进程必须使用 `gs\annotation\Process` 注解定义,必须实现接口`interfaces\InterfaceProcess`.
  5. `name`:指定进程名字,必须唯一,`co`:是否为协程运行,默认为true
  6. ```php
  7. <?php
  8. namespace app\process;
  9. use gs\annotation\Process;
  10. use interfaces\InterfaceProcess;
  11. use Swoole\WebSocket\Server;
  12. use Swoole\Process as SwooleProcess;
  13. /**
  14. * Class CustomProcess
  15. * @package app\process
  16. * @Process(name="test",co=true)
  17. */
  18. class CustomProcess implements InterfaceProcess
  19. {
  20. public static function handle(Server $server, SwooleProcess $process)
  21. {
  22. // TODO: Implement handle() method.
  23. while (true) {
  24. var_dump(__METHOD__);
  25. sleep(2);
  26. }
  27. }
  28. }