【張宴】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外部界面對進程 進行一個組織。由於遊戲服務端最終由每一個進程進行組織,這些性能組織起來,咱們能夠跟不一樣架構服務器端進行通信,無論架構怎麼設計,是一個服務器上運營兩 種服務,或者多臺服務器上運營多種服務,無論架構怎麼變,只要最終定位進程上就能夠解決,對不一樣遊戲兼容性,這樣就能作到一個通用平臺,能作到一個架構之 上的架構。

 

我今天的演講就到此,謝謝你們。

相關文章
相關標籤/搜索