【张宴】PHP在金山游戏运营中的应用

PPT下载地址1(国外服务器):http://blog.s135.com/attachment/201105/2011phptc_zy.zip

PPT下载地址2(国内服务器):http://ishare.iask.sina.com.cn/f/15231659.html

原文:http://blog.s135.com/2011phptc/

大家好,现在我来跟大家分享的是PHP在金山游戏运营中的,包括团队开发,以及像系统结 构,设计,运营平台这些信息。我议题主要有两个,一个是在金山游戏官方网站做的一些应用,还有在金山游戏运营系统Keyes中的应用。金山官方网站包括有 客服,一些问问,知道等等,包括跟游戏相关的一些产品,这块主要采用Linux系统,64位,PHP是5.2版本。

我们首先来看团队协作开发,我们肯定遇到过一个情况,在我们现在很多项目当中都是多个人从事开发一个项目, 又涉及到开发环境和测试环境不一样。我们PHP全部利用在Windows上利用,但是很多人在Linux开发代码,我改完某一个功能,想马上看一下执行结 果,这时在Windows上也可以配相应平台,但是我们还开发一些像PHP扩展去操作一些,假如分布式图片处理,一些缓存系统,这些是针对Linux下 PHP进行一些PHP扩展开发。所以,在Windows平台是没法使用的。

这块希望写一个程序能够马上看到,但是我们不需要写一个程序传到服务器上再测试,就太慢了。如果同一个服务器 上有多少人同时开发,你传上去可能会覆盖别人的程序,就没有办法做到控制。我们可以看到,我们使用是程序员A的 Windows开发环境PC机模式,我们从上面可以看到,假如是程序员A和B都在Windows上开发代码,我们可以把Nginx装在Windows上, 我们在Windows开发程序,每个程序员进行测试,测试完之后可以进行调试,这样执行的结果还是用Linux下进行执行。

从这个流程可以看到,首先是一个程序员他获得一个项目版本,上来做一些修改,修改完之后可以在调试采用同一 个Linux测试服务器。他测试完成之后,在本级测试没有问题,可以提交到我SVN版本库,可以做一个自动同步程序,包括Linux开发和测试服务器上。 这个SVN同步,会自动通知Linux把最新代码进行更新。后来发现有问题,如果我们程序文件特别多的话,之前SVN非常慢,这样程序员在测试完之后,提 交SVN等等。

我们为了方便,因为我们需要做一个预测,我们每天一个虚拟主机,我们在左边添加一个虚拟主机,添加虚拟主机 之后会把当前目录做到Linux上。这可以看到,在下面这是整个流程可以设置tosts为本机IP,在自己电脑上,修改完一个文件,本地调试没有问题之后 就可以提交。在Windows编写代码PHP 代码文件,用Linux环境的PHP来调试,保证开发环境、测试环境生成环境统一。整个PHP开发环境、测试环境,即保证了程序员的快速修改,调式代码需 求,又保证整个代码在SVN版本控制之中。

开发环境这时候又会遇到这样一个问题,PHP代码统一性保证。我们在开发环境先到线下测试环境,线下测试完 之后到线上测试环境,最终到正式环境,这有很多种环境。另外我们开发项目比较多,大概10多个项目,很多项目连接到MySQL、 Memcached、接口IP,发短信,查询下用户数据资料他们端口各不相同,程序员经常搞错,或者一团雾水,这样谁最了解服务器配器,肯定是系统工程 师,这样需要把二者进行分开。让最熟悉这块业务去做,这样我们就开发了一个PHP扩展,还有一个kae-config管理后台,我们在每个服务器上通过个 后台进行发布,需要做的只是系统工程师在不同环境,对不同服务器系统,配置不同参数,不同IP端口。

每个PHP版本都进行统一之后,包括PHP文件进行统一之后,就涉及到PHP代码上线发布。不知道其他公司 怎么做,我们把上线发布这一块,交给每个项目负责程序开发负责人去做,这块就可以把系统工程师从代码发布中解放出来。从上线发布版本,假如我们要发布一个 1.0版本,这是2.1.46版本,可以进行对应起来,如果我要发用户中心2.1.46版本,就可以对应21901,两个版本之间和上个版本,假如2万版 本之间有哪些修改,我们可以通过PHP获取出来。通过系统发布的时候,我们就只能发布这个文件。

于是我们开发一个代码发布后台,从上面两个标红的地方可以看到,我们新增一个发布会新增一个版本号,有主版 本,次要版本。这样的话对每个工程师会开发一个版本,包括一个项目,可以有不同负责人去进行商业发布,每个上线会提交相关信息。从右边按纽可以看到,我们 要启动哪个版本的时候,我们可以进行版本发布,如果我们发现这个版本上线之后,如果有重大问题,假如需要很长时间解决,马上回到上一个版本,通过每次版本 发布内容进行版本控制,这样整个版本发布一目了然。

第三PHP与开源产品、C/C++程序组合。利用PHP客户端扩展,通过TCP协议与C/C++开源程序进 行通讯,例如与Sphinx而搜索等等。方式二,我们是开发一些基于HTTP协议与C/C++开源程序进行通讯,例如与我们字形开发的开源简单消息队列软 件,HTTPQS进行通讯。PHP Web程序,Web程序要求每次请求都要非常快,处理速度需要在毫秒级解决。我们也遇到一些服务,比如发手机短信,还有发送邮件也需要几十秒时间,这让用 户在前端页面等待对用户体验不好。

还有上传视频,我们需要视频格式转换,以及我们进行数据挖掘,需要记录用户的一些信息,记录一些日志,这样 我们就需要异步处理。为了解决异步处理,我们也是分为两种情况。一个是短耗时异步处理,耗1、2秒时间,记录一些数字挖掘信息,这可能耗的时间比较短,这 时候我们可以用PHP-FPM提供 fastcgi-finish-reques函数。从调入这个函数之后,下面执行结果用户不会去等待下面这个结果,这样可以实现一些异步。

fastcgi-finish-reques函数缺点。PHPFastCGI进程数有限,正在处理异步操作 的PHP-CGI进程,无法处理新请求。如果并发访问量较大,php-cgi进程数用满,新访问请求,将没有php-cgi额去处理。Nginx服务器会 出现,502 Bad操作采取队列式进行解决,包括开源队列。这样的话,在我们产品应用中,我们应用到下面一些清我们发送短信,我们可以先入队列,最后从队列进行邮件发 送,像刷新前面页面缓存,获益做上面视频页面转换都可以进行异步方式解决。

我们采用一个PHP负载均衡方式,从这个架构图是我们一个大概游戏官网架构。可以看到有论坛,有普通一些 PHP服务,最前端我们用两台服务器去进行均衡,下面比较大的业务像一些论坛,或者是游戏活动,单独画一组PHP外部服务器。这样通过负载均衡去分发到下 面PHP进行义务处理,从PHP到后端又会连接一些,刚才我们提到一些像分布式图片处理,一些搜索引擎,像这些接口进行操作。

当然我们在开发服务,因为我们有多台WEB服务器,我们在PHP开发的时候也需要注意。以前单机程序为了近 来缓存,如果布置在多台服务器,可能在这台服务器生存了,在那台服务器上没有生存。另外每次访问会生成很多小文件,小文件会占用Linux大量浏览,有时 候磁盘没有完,但是没有办法新建文件了,因为建了很多小缓存文件,导致整个应用满了。这样对数据对象缓存我用APC、Memcached代替。

还有HTML输出网页缓存,我们用前端Nginx负载均衡来做一个缓存。Nginx负载均衡现在也可以支持 缓存,把动态一些内容访问到后端WEB服务器进行缓存。如果是一些长期页面,像游戏官网,像一些图片不仅能改变。有一个优点,WEB服务器上,PHP文件 能够通过代码发布系统统一管理,增,删WEB服务器,非常快捷,清除缓存,能够由系统工程师去统一管理。

另外涉及到代码防篡改,万一有客户上传木马上去,也能够在我们PHP程序中开发一个预判断进行一个解决。因 为我们PHP程序是通过代码系统发布,能够让它执行,如果不是通过我们代码发布系统发布的程序,假如他在上面创建一个PHP文件,或者上传一个PHP文 件,这也是不经过代码发布系统生成,同时会发一个报警短信,报警文件给你相应系统工程师进行查看。多台服务器有Session会话,有一些登录操作。我们 一个采用在负载均衡服务器上做IP哈希,不同用户根据IP不同分布到不同服务器。另外在PHPWeb服务器上做Session共享,必不可少。

下面是PHP在金山游戏运营系统Keyes中应用。包括一个游戏,如何开活,发广播等这些信息需要通过一个 平台来解决。这是我们设计的一个架构,主要是分为界面,接口和支撑,三层架构设计。从最早做三角是一个管理界面,现在很多项目也进行一些IPI开发,肯定 IPI是单独一套,本站自己使用界面也是一套。但是我们会把它完全做成一个IPI,对数据一些功能操作全部分在IPI接口,管理界面只是实现管理界面的逻 辑。我在这个运营管理系统当中可以进行查看,比如一些经营分析系统,也需要获取用户在线信息,可以调取PHP进行操作。

在右边这个部分是属于游戏服务器,左边是运营服务器,右边是一些游戏服务器。游戏服务器上,涉及到每个游戏 服务端架构都不一样,他也包括服务端架构也是跨服务器的,像网端服务器。我们运营每一台服务器上有一个守护进程,我们采用Knose开发,我们通过一个加 密协议进行访问。我们通过多个游戏进程进行访问,包括开发一些指令,发送一些信号,在和他游戏通信,有我们可以监控进程存在,这个进程和通讯是否正常。

可能有这样一种情况,一个是游戏进程存在,假如因为游戏内部僵死了,这时候我们通过一个PHP心跳,游戏服 务端进程服务,就认为这个服务端进程是存活的。从外部去管理游戏服务器,这一块我们涉及到一个时间问题。因为我们外部程序需要时间非常快,我发布一个停滞 指令,在游戏服务器需要从网端去建立用户一些连接,还有保存一些用户数据,他完成整个过程才能把整个游戏服务端停掉,如果引入比较多,保证数据可能是几十 秒到1分钟,从前端外部用户去进行介入会发现超时情况,外部需要做一个操作马上能够完成。这样我们去设计接口的时候,我们从PHP管理界面,我们发起一个 功能接口,这个功能接口就进行转发,这个请求完成,去通知各个游戏进程做一个评估操作,做完评估操作之后发起一个新的请求去回掉这边PHP功能接口,这样 的话就变成一个异步过程。

下面是一个数据交互过程,分为四项功能。一个是运营指令,涉及到修改经验倍数,踢人,发消息广播,启动游 戏,停止游戏、更新游戏程序,更新配置文件、并服。第二个是服务器监控,包括CPU、磁盘、内存、进程数、系统负载、游戏服务端进程是否存在。游戏心跳检 测,Ping包检测,确定游戏是否正常运行,还有游戏在线人数,查看游戏总在线人数。

我们在开发这套平台的时候遇到这种情况,一套程序需要不同游戏服务端架构。现在我们还带领别的公司一些游 戏,带领别的公司游戏服务端架构不一样,这样的话我们去怎样用一套平台去适应每一个游戏工作室,或者游戏开发公司架构呢。前期我们肯定是考虑这样一个方 法,我们提供一个IPI接口,制定一个游戏,按照他们都要按照这个协议,按照这个IPI接口进行接入。到实际进行开发的时候会发现遇到一些问题,我们在各 种游戏需要接入运营系统的时候,这个游戏基本上已经成型了,到绿色状态。他们每个游戏可能需要进行一些,他们也会利用一些框架进行开发,包括GSP协议框 架,他们已经封装好了,马上可以按照我们这个协议去做。

如果按照我们提供的接口来开发,可能从时间上,成本上都会存在一个问题。这就是我们进行一个举例,我们如果 派大巴车去接,有些人说我喜欢自己开车过来,可能别的人喜欢骑摩托车过来,这就代表这封装一些框架,对协议的处理都不一样。可能也有比较愿意接受这套方案 的,这样的话为了能够让每一个游戏研发公司都能够去适应我们这个平台进行快速接入,我们就需要对接口方案进行改造。

这就有点像我们开车一样,我们来派大巴车去接方案,我们改了一个更开阔的方案,我们和各个游戏进行,你们只 要使用PHP协议和我们通讯就可以了,我们去做一个道路设计。我们修一条公路,你们想开奥迪宝马都可以,想骑摩托车过来也都可以,我们会制定一个协议事 例,你想按照这套事例来都可以。这样每个游戏需要遵循我们这个平台,但是这样的话也需要一些约束,比如我要开飞机过来肯定不行,虽然可以给他们更宽松的制 约,但是也需要遵守一些规定,比如你开车过来不能闯红灯,需要遵守一些交通规则。我们会根据不同游戏,可以分为二进制协议,因为的话制定二进制协 议,PHP是一个流媒体秀逸我们需要进行分包,有些游戏在一个协议包中间某两个字节表示游戏包长度。我们通过配置文件,去设定对二进制要求。

最终每个协议不同,运行系统需要解析出来这部分过程,放到左边PHP功能结构。PHP开发非常迅速,我们同 样去解析他一个歇息也会非常迅速。他通过一个 PHP流动协议,我们去进行一个转化,转化成一个IP请求,这样PHP只要能够对他游戏协议进行一个解析,这样就可以轻松地完成。可能解析代码非常简单, 这块从开发层面来说非常快了。我们在3月份的介入三款游戏,同一时间同时介入,最后同一时期完成介入,这也是从结构设计来设定的。

每个游戏服务端架构不同,最终分散起来只能定义为进程。游戏决策这部分可能有四个进程,上面这个服务器又分 不同服务器,下面这个进程又分不同服务器。上面三个进程利用在Windows服务器上,剩下几个利用在Linux上,这样的话我们在PHP外部界面对进程 进行一个组织。因为游戏服务端最终由每个进程进行组织,这些性能组织起来,我们可以跟不同架构服务器端进行通讯,不管架构怎么设计,是一个服务器上运营两 种服务,或者多台服务器上运营多种服务,不管架构怎么变,只要最终定位进程上就可以解决,对不同游戏兼容性,这样就能做到一个通用平台,能做到一个架构之 上的架构。

我今天的演讲就到此,谢谢大家。

时间: 2024-10-19 00:33:51

【张宴】PHP在金山游戏运营中的应用的相关文章

架构师-盛大许式伟VS金山张宴

许式伟:作为系统架构师,您一般会从哪些方面来保证网站的高可用性(降低故障时间)? 张宴:很多因素都会导致网站发生故障,从而影响网站的高可用性,比如服务器硬件故障.软件系统故障.IDC机房故障.程序上线前测试未发现的Bug.遭受分布式攻击.突发访问人数剧增等. 一套良好的网站系统架构,应该尽可能地避免只有一台服务器.一个数据库.一套软件节点等单点故障的存在.单点故障一旦发生,将直接导致网站服务不可 用,恢复正常服务所需的时间也比较长,甚至还可能无法恢复.负载均衡集群.双节点热备.分布式处理等都可以

unity3f游戏开发之游戏设计中运营重用体系

游戏设计中,运用重用体系重用资源包括有以下几个设计目的: 1).方便玩家识别 为了方便玩家识别某一类游戏中的要素,而采用的设计目的.如某种某种动物的皮毛的道具图标.为了区分不同,除了基本图素相同外,不同之处只是以变换颜色和更改名称加以区分,这样可以方便玩家快速识别图标. 2).降低客户端的容量 游戏中最占用硬盘空间的,其实是大量的资源,如模型文件.贴图等美术资源文件.为了降低客户端的容量,开发者除了要采用压包技术进行资源压包外,在设计的过程中,设计师还要考虑到客户端容量大小的问题(特别是某些2D

游戏开发中,图片资源的精简

在游戏开发中,包的大小总是与图片资源的大小密切相关,而图片资源中,大多为带有透明度信息的png图像. 那么,如何精简png图片资源呢? 1.图像压缩是一种方法,然而随着压缩率的增大.图片品质也越来越差.(舍弃) 2.我们另辟蹊径,采用png图像拆分.(近乎无损,资源精简) 一.原理:将png图像转化为两张jpeg图像进行存储 pngSplit下载 pngSplit使用说明 二.使用方法: 1.LibGdx中,通过Pixmap使用 // 如工程目录assets/texture/0_1.jpeg下:

游戏运营感悟之反馈内容

一.今天在群里面看到有人吐槽运营的压力很大,结合朋友因为KPI不达标,导致被辞退的案例,貌似自己做的就是最苦最累的活,然后群里面的大局观分子看不下去了,出来喷了两句,主要的质问内容是:你自己做了什么,谁没有KPI压力? 二.运营的实际内容确实很杂,因为运营作为中心环节,几乎对接了项目的全局内容,从研发到市场,商务,广告及客服,因为工作的范围是很宽的,所以接触的面很宽,但是运营的核心只有一个,那就是为游戏的营收负责,这就带来了运营的几个问题: 1.运营只是中心环节,当项目不能达到预期时,怎么合理的

游戏设计中的道德

最近一直在思考一些关于游戏设计方面的问题.入行已经两年了,以前跟所有刚入行的朋友一样,一直想着怎么从自己设计的游戏中赚钱.怎么让玩家为我的劳动成果买单.当然,我并不是说这样不好,因为只要形成一个良性的循环,优秀的游戏才会持续不断的出现,君不见,几年前国内还是有很多优秀的单机游戏的,但是由于破解的存在,以及中国人在几年前还有着"我都花钱买了电脑了,难道软件还要钱吗?更别提游戏了."这些众所周知的原因,现在中国的市场上已经很难看到新的优秀单机游戏的出现了,还好手游平台拓宽了国内的游戏市场,

游戏开发中的一些基本方法

一.              检测对象变化的两种基本方式: 学过<微机原理>的人应该都了解这两种方式 1.       轮询 1) 每帧轮询 2) 定时轮询 按业务需求和性能问题选择 2.       中断(并非硬件中断,而是软件的事件通知方式) 两种模式: 1)       观察者模式 优点:① 扩展性强,事件发起接口不变,只需增加事件类型 ② 只通知对某件事有兴趣的对象,不会浪费性能 ③ 每种事件对应一种回调函数,对于回调函数,事件参数类型是固定的,MouseMove事件的参数类型肯定是

网页游戏运营模式研究

网页游戏的定义   网页游戏的英文名称为又称无客户端网络游戏,它是基于浏览器的网络在线多人互动的游戏,也是网络游戏的一种.这种游戏的特点是玩家无需下载游戏客户端及安装,只需短短的几秒钟就可打开网页用浏览器加载就能玩的网络游戏.尤其适合上班及没有时间休闲娱乐的人群,只要花一点点时间并且消费成本比较低,而且游戏内具有自动成长功能,玩家即使关掉电脑也可心满意足的去工作,如果想随时了解游戏内的具体情况,还有一些游戏具有短信提醒功能. 中国网页游戏从发展初期,再到如今的爆发式发展,中国网页游戏规模不断的扩

游戏服务器中的日志处理方式之一

在游戏开发的过程中,我们需要记录一些日志,以便以后了解游戏运行的情况,以及根据日志发现并处理游戏中的突发情况. 一,游戏日志可以分为以下几种:1)系统日志2)用户操作日志3)异常日志,即错误日志 系统日志 系统日志一般描述的是服务器日常运行的状态.比如启动是否成功,每天统计一下内存的占用量,CPU的使用量等信息.用于查检服务器运行的健康状况.这对于技术分析来说是非常重要的.如果没有这些信息,一但服务器宕机,我们就两眼一抺黑,不知从何下手了.这部分日志一般产生的文件不大,内容不是太多,可以记录成文

游戏制作中的大宝剑---常用的数据结构与算法

前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示 个人认为可以了解的内容-------紫色字体显示 --------------------------------------------------------------------------- ---------------------------------