swoole协程+zephir纯php开发大型RPG微信小游戏(已开源)

概述

一年之前,朋友开游戏公司,让我帮忙设计RPG游戏的后台架构,我思考如何兼顾开发效率和性能,最终想到了 php + swoole协程 + swoole_orm + zephir ,微信小游戏搜索:“剑的传说”

swoole协程有着极高的IO并发能力

swoole_orm 是我开发的php 扩展,有着非常高的性能、sql安全性和开发效率,开源地址为: https://github.com/swoole/ext-orm

游戏的战斗部分完全用 zephir 来实现,宣称像写php一样写php扩展,能做到同时兼顾性能和开发效率,整个技能过程属于计算密集型运算,如果用PHP实现,对CPU的压力非常大,PHP不擅长计算密集型应用,尤其在协程情况下,太高的CPU占用会导致其它协程饿死,尽管swoole支持抢占式协程,所以这里采用zephir将类php语言转化为c语言扩展,性能媲美c语言,而且开发速度快。(zephir 代码有机会我再开源出来,目前时机不成熟,游戏还比较火热)

后台框架开源地址:https://github.com/caohao-php/ycsocket

在这里插入图片描述

仅展示部分zephir代码,整个技能过程属于计算密集型运算,如果用PHP实现,对CPU的压力非常大,PHP不擅长计算密集型应用,尤其在协程情况下,太高的CPU占用会导致其它协程饿死,尽管swoole支持抢占式协程,所以这里采用zephir将类php语言转化为c语言扩展,性能媲美c语言,而且开发速度快。
在这里插入图片描述
伤害计算:在这里插入图片描述

代码结构

———————————————— 
|--- server.php               //启动入口 
|--- system                   //框架系统代码
|--- application              //业务代码 
         |----- config        //配置目录
         |----- controller    //控制器目录
                |------ Game.php    //Game控制器
         |----- dao           //数据层
         |----- library       //公用类库
         |----- service       //业务层

请求路由

webSocket.send('{"c":"game","m":"ver", "userid":123593}');

输入参数为json, 根据 c 和 m 参数,路由到 controller/Game.php 下 verAction 函数。路由逻辑在 Application->run() 方法中,
路由之前,首先会调用 Filter::auth($params) 对参数验签,我们可以在该函数中加入自己的签名验证逻辑。

//system/Application.php
class Application
{
   
    public function run(& $params, $clientInfo)
    {
   
        $ret = Filter::auth($params);
        if ($ret != 0) {
   
            return $ret;
        }

        foreach ($params as $k => $v) {
   
            $params[$k] = trim($v);
        }

        $controller = ucfirst($params['c']);
        $action = $params['m'] . "Action";
        $class_name = $controller . "Controller";

        try {
   
            $obj = new $class_name($params, $clientInfo);

            if (!method_exists($obj, $action)) {
   
                unset($obj);
                show_404("$controller/$action");
                return $this->response_error(3, "route error");
            }

            $ret = $obj->$action();
            unset($obj);
            return $ret;
        } catch (Exception $e) {
   
            unset($obj);

            if ($e instanceof LogicException) {
    //业务异常
                $errorcode = $e->getCode() == 0 ? 8 : $e->getCode();
                return $this->response_error($errorcode, $e->getMessage());
            } else if ($e->getMessage() != 'swoole exit.') {
   
                Logger::error("Catch An Exception File=[" . $e->getFile() . "|" . $e->getLine() . "] Code=[" . $e->getCode() . "], Message=[" . $e
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值