基于PHP的socket游戏服务器设计与实现
王盛林
【摘 要】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, usehigh-efficiency PHP framework to develop the game logic , and game logicdon't need to care about the server communication details. This paper mainly describes the system in three parts from the base layer and core layer and application layer. Among them, the base layer is mainly done to pave the way for the subsequent development of pre-module, which consists of data, protocol modules;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 development of a good stability and speed.%近年来网页游戏、手机游戏快速发展,对游戏
服务端提出新的要求:架构简单、配置灵活,同时可支持快速开发。文中提出一种架构:服务器底层通讯基于高性能的socket库开发,而游戏逻辑采用成熟的PHP框架开发,游戏逻辑不关心底层细节达到快速高效的目的。文中主要分三层介绍:基础层主要采用libevent和ZeroMQ的API;核心服务层提供网络通讯和数据存储服务;应用层处理游戏内的逻辑。此外,以该架构的游戏服务器已在两款网页游戏开服上百组,性能测试稳定。
【期刊名称】《电子设计工程》
【年(卷),期】2016(024)020
【总页数】4页(P125-128)
【关键词】游戏服务器;套接字;libevent;ZeroMQ;PHP
【作 者】王盛林
【作者单位】上海竹灵网络科技有限公司 上海 200120
【正文语种】中 文
【中图分类】TM933.4
在游戏产业快速发展的今天,越来越多的公司因为一款游戏就从互联网公司当中脱颖而出,相比于传统的MMORPG客户端游戏,网页游戏与手机游戏由于其便捷性更容易实际盈利目标。因单服规模相对较小,游戏服务端无须复杂的服务器架构,需要能快速开服,如何能保持在多人同时游戏时的流畅性以及系统的稳定性是对游戏开发人员的一大考验。由于这类游戏要求开发周期短、开服速度快,因此需要综合考虑成本与机动性,同时又要求保证性能。文中就当前比较热门的网页游戏和手机游戏,提出了一款基于PHP的Socket的游戏服务器,在底层引进 libevent库提高负载能力和ZeroMQ库来进行服务器的通讯,游戏逻辑层采用PHP开发,最终达到快速与高效的目的。
1.1 基础层分析
游戏服务器采用PHP作为脚本开发语言,因其跨平台、易布署、维护方便等特性,得到广泛应用。通过Socket网络编程中成熟的技术方案来处理游戏中高连接数、高吞吐量的事件[1]。同时PHP支持C编写扩展,可以做到与游戏服务器数据通讯一致。在底层采用类库有:
1)Libevent库,使用事件驱动方式极大的降低资源占用,增大服务接待能力,并提高网络传输效率。
php文件管理系统mvc 源码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)开源社区支持,支持多种开发语言。
传统客户端服务器在线人数多,游戏逻辑复杂,所以已发展出成熟的解决方案:如魔兽世界(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 定时器服务
定时器服务是以加载配置的方式,执行应用层的业务逻辑。可直接使用其来创建定时启动
、关闭应用。设定时间到来时,会自动执行配置中指定应用层游戏逻辑。一般用在游戏活动开启、关闭,定时恢复游戏属性等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论