基于PHP的socket游戏服务器设计与实现

2016-11-09 11:03王盛林
电子设计工程 2016年20期
关键词:充值客户端逻辑

王盛林

(上海竹灵网络科技有限公司 上海200120)

基于PHP的socket游戏服务器设计与实现

王盛林

(上海竹灵网络科技有限公司 上海200120)

近年来网页游戏、手机游戏快速发展,对游戏服务端提出新的要求:架构简单、配置灵活,同时可支持快速开发。文中提出一种架构:服务器底层通讯基于高性能的socket库开发,而游戏逻辑采用成熟的PHP框架开发,游戏逻辑不关心底层细节达到快速高效的目的。文中主要分三层介绍:基础层主要采用libevent和ZeroMQ的API;核心服务层提供网络通讯和数据存储服务;应用层处理游戏内的逻辑。此外,以该架构的游戏服务器已在两款网页游戏开服上百组,性能测试稳定。

游戏服务器;套接字;libevent;ZeroMQ;PHP

在游戏产业快速发展的今天,越来越多的公司因为一款游戏就从互联网公司当中脱颖而出,相比于传统的MMORPG客户端游戏,网页游戏与手机游戏由于其便捷性更容易实际盈利目标。因单服规模相对较小,游戏服务端无须复杂的服务器架构,需要能快速开服,如何能保持在多人同时游戏时的流畅性以及系统的稳定性是对游戏开发人员的一大考验。由于这类游戏要求开发周期短、开服速度快,因此需要综合考虑成本与机动性,同时又要求保证性能。文中就当前比较热门的网页游戏和手机游戏,提出了一款基于PHP的Socket的游戏服务器,在底层引进 libevent库提高负载能力和ZeroMQ库来进行服务器的通讯,游戏逻辑层采用PHP开发,最终达到快速与高效的目的。

1 游戏服务器基础层设计

1.1 基础层分析

游戏服务器采用PHP作为脚本开发语言,因其跨平台、易布署、维护方便等特性,得到广泛应用。通过Socket网络编程中成熟的技术方案来处理游戏中高连接数、高吞吐量的事件[1]。同时PHP支持C编写扩展,可以做到与游戏服务器数据通讯一致。在底层采用类库有:

1)Libevent库,使用事件驱动方式极大的降低资源占用,增大服务接待能力,并提高网络传输效率。

2)ZeroMQ号称“史上最快的消息队列”,他提供的API让复杂的消息处理更加简洁同时性能更高。

1.2 底层库libevent

libevent是一个开源的事件触发的网络库,适用于windows、linux、bsd等多种平台,按不同平台采用select、epoll、kqueue等系统调用管理事件机制。对于每个网络请求,libevent相当于在各个平台的网络后端增加一个包装器,让事件管理在得以最高效最高性能,同时事件系统优化让处理函数非常方便,有效降低底层I/O复杂性。其主要功能有:

1)采用事件驱动机制,异步调用性能高。

2)专注于网络处理,方便编写。

3)跨平台支持,尝试使用每个平台上最高速的非阻塞IO实现,并且不引入太多的额外开销。

4)支持I/O(socket)、定时器和信号事件。

5)支持多种I/O多路复用技术,有效提高网络传输效率。

6)其他组件提供缓冲的事件系统,以及HTTP、DNS和RPC系统核心实现。

libevent在网络编程得到充分验证,采用基于libevent为底层的成熟服务器端:Memcache(分布式缓存)[2],PLB(负载均衡器),而对PHP支持很好的有Swoole[3]、ReactPHP[4]等。

1.3 底层库ZeroMQ

ZeroMQ[5]是消息队列管理库,其提供底层的网络通讯库,对Socket API做了一层封装,将网络通讯、进程通讯和线程通讯作为统一的API接口,其主要优点有:

1)支持高并发、异步调用,速度快。

2)支持多个消息传送模式:如P2P、订阅发布模式、以及请求响应模式。

3)支持多个平台:如Linux/Windows/OSX等。

4)协议比 TCP更快、适用于大型集群和分布式计算

5)开源社区支持,支持多种开发语言。

图1 游戏服务器端结构示意图

2 游戏服务器核心层设计

传统客户端服务器在线人数多,游戏逻辑复杂,所以已发展出成熟的解决方案:如魔兽世界(WOW)采用的BigWorld[6]方案,功能强大,动态负载均衡和容错性做了很多工作,但同时硬件要求比较高,价格昂贵。它的服务器端架构分为Gate(网关服务器,负责客户端连接及消息转发)、GameServer(提供游戏逻辑功能的服务器程序)、DBManager(负责将游戏数据写入到数据库)、GameManager(处理所有GameServer中消息处理)。

文中主要借鉴这种架构思路:按数据通讯服务、数据存储服务、定时器服务、消息服务划分,可实现一台独立物理服务器提供所有核心服务,或者一个服务提供给多台服务器,同时还支持分布式服务,按照实际开服情况灵活处理,实现快速机动、节约成本。

2.1 数据通讯服务

2.1.1 功能说明

数据通讯服务类似Gateway网关服务器,负责网络数据的接收与发送,将客户端发送的数据解码后发送游戏逻辑层处理,对游戏逻辑发过来的数据编码后发送给客户端。由于在线玩家通过TCP直接连到服务器,所以承载很大的压力,数据通讯服务具有如下特点:

1)响应时间及时:与游戏客户端一样,响应越快游戏越流畅,延时过长会大大降低游戏体检。

2)服务可扩展:根据游戏人数确定增加负载能力,如增加Worker进程,多开通讯进程等。

3)服务稳定性:游戏是7*24不间断服务,所以需要提供由于在线人数多或者少各种情况下的应用平稳以及各种异常的修复及处理功能。

2.1.2 方案说明

游戏服务是网络IO密集型服务,采用方案是:

1)采用libevent库作为网络通讯接口:由于libevent采用事件驱动模式,非阻塞网络IO,采用EPOLL事件轮循机制,尽管采用多进程,但由于游戏逻辑执行优化后,并行处理数据输入输出还是很高效的。通讯服务以常驻进程方式启动,worker进程收到客户端发来的请求,以C加载CLI的方式执行PHP业务逻辑,处理结果PHP通知给worker,中间用C编写的PHP扩展保持数据结构一致。

2)服务端采用Master-Workers结构 (管理者-工作者):这种结构能够动态管理游戏服务进程,从而提高处理效率。如:Nginx[6]、PHP-FPM[7]都采用这种方式。主要特点有:

①多进程由操作系统来调度,管理方便,运行起来比较强壮稳定。

②隔离性好,可由Master来管理worker进程,实现平滑的加载游戏配置以达热更新。

③充分利用多核cpu来进行并行运算,利用率高。具体工作示意图如图2。

图2 通讯服务结构示意图

2.2 定时器服务

定时器服务是以加载配置的方式,执行应用层的业务逻辑。可直接使用其来创建定时启动、关闭应用。设定时间到来时,会自动执行配置中指定应用层游戏逻辑。一般用在游戏活动开启、关闭,定时恢复游戏属性等。

其中游戏中一些需要异步去处理的应用,以常驻进程方式加载,也用定时器来实现。如一些比较占用网络IO资源、业务逻辑复杂的服务:合作商之间的充值验证服务、游戏战斗结算服务等,以队列形式处理请求,有效平衡服务器负载。

2.3 数据存储服务

游戏中玩家数据分成两种方式存储:一种存储在物理介质上的DataBase(如一般的关系型数据库,MySQL/SQLServer等)中,另一种存储在内存为介质的NoSQL中 (如Redis、Mongo等)。考虑到游戏的高性能需要,对于实时操作的数据放在以内存为介质的NoSQL中,而那些需要提供给数据分析的数据会写入数据库中。

2.3.1 关系型数据库DataBase

关系型数据库是创建在关系模型(relational database)基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据。由于游戏中操作频繁,磁盘IO成了性能瓶颈,主要用于玩家游戏数据的持久化:如保留一些用户信息以及游戏日志。

2.3.2 内存型数据库NoSQL

NoSQL不同于传统的关系型数据库,已经不使用SQL作为查询语言。NoSQL数据库有几大好处:大数据量,高性能,支持集群,易部署。本例采用的Redis[8]是一种key-value对应结构的内存数据库,存储效率高。同时支持定时器、自动排序结构(stored set)、逻辑事务等结构,适合游戏内的逻辑。还利用其提供的持久化用作游戏数据的备份。

2.4 消息通知服务

游戏逻辑需要在服务之间以及服务器组之间传递消息。文中采用的是ZeroMQ,其除了简洁快速外,对其中组件的启动顺序没有要求,适合游戏服务器动态扩展。文中使用ZeroMQ主要用到他的通讯模式只有两类。

1)请求回应模型(Request-Reply)。

该模型为请求端(REQ)发起请求,等待回应端(REP)回应。因REQ端均只能在单线程中运行,因此必须要recv与send配对使用,但利用支持的路由功能(Router),加大了REQ端的扩展性,如下图3,在游戏服务器常见情景如:客户端发起战斗请求,服务端将复杂的运算结果返回给客户端。

图3 ZeroMQ的请求回应模型

2)发布订阅模型(Publish-Subscribe)。

订阅端一旦连接上发布端就能收到发布端发送的消息,而没连接上不影响发布端发布给其他订阅端。同时如果发布端丢失,所有订阅端都会等待发布端连接上直至发布新的消息,如下图4所示。而对于订阅端断线重连消息丢失以及订阅端后连接上而丢失消息均可有相应解决方案。在游戏中实际常用在跨区玩法:不同游戏区组成一个跨区让玩家玩一个模块,跨区服相当于发布端,其他游戏大区相当于订阅者,从而实现跨区消息传送目的。

图4 ZeroMQ的发布订阅模型

3 游戏服务器应用层设计

应用层采用PHP开发,开发效率高,适合于页游、手游这类快速开服平台。采用高性能框架,采用内存化数据缓存,能保证游戏逻辑快速响应。

3.1 开发框架

采用Yaf(Yet Another Framework)是由PHP核心开发组成员惠新宸开发一款用C语言扩展开源框,与其他框架CI、Zend Framework,Yii相比效率更高,无需编译,在PHP启动时加载,并常驻内存。优化如图5。

图5 优化框架图

同时支持MVC(Model-View-Controller,应用逻辑和表现逻辑分开)。游戏处理请求与发送请求代码如下例:

3.2 加密与安全

由于PHP是一种脚本型语言,以明文方式保存在服务器,所以并不安全。可以采用Zend Guard Loader、ioncube等商业软件来加密源代码。

3.3 优化与加速

由于PHP预编译时会把源码编成opcode缓存来达到加速目的,这里开启PHP5.5以后自带OPCache[11],相对比eacce lerator、xcache、apc等缓存工具更稳定。

对于游戏逻辑中用到的大量配置文件,采用缓存到redis方法达到加速目的。

3.4 模块说明

3.4.1 游戏逻辑模块

采用MVC开发模式,Models模型文件提供接口给Controller来处理游戏逻辑。

3.4.2 登陆模块

由于目前手机游戏和网页游戏大多联合运营,登陆、充值模块都是以接口的方式与运营平台通讯,所以这里采用WEB方式与平台对接,与平台验证成功便可进入游戏逻辑。采用访问白名单方式来保证通讯安全,同时写入登陆日志以备查询。

3.4.3 充值模块

游戏开发商提供充值接口与运营平台充值平台对接,来完成游戏内充值。在游戏内需要一个常驻进程来处理来自运营平台的充值逻辑。同样这个接口需要设置白名单来保证安全性。由于充值会涉及很多游戏逻辑,所以这里将以队列形式(如:Redis的List数据类型)来处理。

3.4.4 日志模块

1)一般游戏日志:如用户消费日志,使用日志一般均是在游戏逻辑中以数据库形式保存,方便查询和制作数据报表

2)游戏运行日志:包括游戏逻辑异常、worker进程异常日志,一般以文本形式保存,方便改进。

4 结束语

在游戏行业快速发展的今天,技术变化日新月异,不断有更优化、更适合的方案出现。基于PHP的socket游戏服务器方案优点明显,但也有一些缺点。若是计算密集型应用,就无法体现出libevent提供的异步非阻塞IO的优点。本文从基础层、核心层以及应用层三部分进行系统的介绍,实现一种快速高效的解决方案。通过对实际游戏运行测试,结果表明该服务器可实现较高的稳定性和运行速度,达到所需目的。

[1](美)Pieter Hintjens.ZeroMQ:云时代极速消息通信库[M].卢涛,李颖译.北京:电子工业出版社,2015.

[2]李子婷.基于分布式中间件的多人在线网络游戏的构建[D].上海:复旦大学,2010.

[3]陈俊,黄维平.分布式Memcached在社交游戏中的应用研究[J].电脑知识与技术,2011,7(10):2301-2305.

[4]Kjetil Raaen,Hard Espeland&HonKvale Stensland.ADemonstration Of aLoekless,Relaxed Atomicity State Parallel Game Server[D].NorwaySimulaResearchLaboratory,2010.

[5](美)Pieter Hintjens.ZeroMQ:云时代极速消息通信库[M].卢涛,李颖译.北京:电子工业出版社,2015.

[6]深入理解Nginx[M].陶辉.北京:机械工业出版社,2013.

[7](美)W.Richard Stevens,(美)BillFenner,(美)Andrew M.Rudoff.Tudoff.UNIX网络编程卷1:套接字联网API[M].3版.北京:人民邮电出版社,2010.

[8]Redis设计与实现[M].黄健宏.北京:机械工业出版社,2014.

The architectures of socket game server based on PHP

WANG Sheng-lin
(Shanghai Zhulin Network Inc.PostCode,Shanghai200120,China)

Web games,mobile games fast development today,the game server need simplearchitectures,flexible configuationandsupport high-efficiencydevelopment.This paper presents the design of Socket server-based game,usehighefficiency PHP framework to develop the game logic,and game logicdon't need to care about the server communication details.This papermainly describes the system in three parts from the base layer and core layer and application layer.Among them,the base layer ismainly done to pave the way for the subsequent development of pre-module,which consists of data,protocolmodules;the core layer provide data communication and data storage;application layer is the base layer on the base,by calling each module server package and handling agreements.In order to improve server performance and speed,at the application layer adds libevent and ZeroMQ two open source model.In this paper,the proposed technology for the server based on the developmentofa good stability and speed.

gameserver;Socket;libevent;ZeroMQ

TM933.4

A

1674-6236(2016)20-0125-04

2015-10-28 稿件编号:201510208

王盛林(1977—),男,湖北蕲春人,工程师。研究方向:网页游戏移动游戏系统架构与开发。

猜你喜欢
充值客户端逻辑
刑事印证证明准确达成的逻辑反思
逻辑
创新的逻辑
如何看待传统媒体新闻客户端的“断舍离”?
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
奇妙的智商充值店
大枢纽 云平台 客户端——中央人民广播电台的探索之路
女人买买买的神逻辑
充值