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

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

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

原文: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程序要求每次请求都要很是快,处理速度须要在毫秒级解决。咱们也遇到一些服务,好比发手机短信,还有发送邮件也须要几十秒时间,这让用 户在前端页面等待对用户体验很差。

 

还有上传视频,咱们须要视频格式转换,以及咱们进行数据挖掘,须要记录用户的一些信息,记录一些日志,这样 咱们就须要异步处理。为了解决异步处理,咱们也是分为两种状况。一个是短耗时异步处理,耗一、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外部界面对进程 进行一个组织。由于游戏服务端最终由每一个进程进行组织,这些性能组织起来,咱们能够跟不一样架构服务器端进行通信,无论架构怎么设计,是一个服务器上运营两 种服务,或者多台服务器上运营多种服务,无论架构怎么变,只要最终定位进程上就能够解决,对不一样游戏兼容性,这样就能作到一个通用平台,能作到一个架构之 上的架构。

 

我今天的演讲就到此,谢谢你们。