大家好,現在我來跟大家分享的是PHP在金山遊戲運營中的,包括團隊開發,以及像系統結構,設計,運營平台這些資訊。我議題主要有兩個,一個是在金山遊戲官方網站做的一些應用,還有在金山遊戲運營系統Keyes中的應用。金山官方網站包括有客服,一些問問,知道
大家好,現在我來跟大家分享的是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外部介面對進程進行一個組織。因為遊戲服務端最終由每個進程進行組織,這些效能組織起來,我們可以跟不同架構伺服器端進行通訊,不管架構怎麼設計,是一個伺服器上運營兩種服務,或者多台伺服器上運營多種服務,不管架構怎麼變,只要最終定位進程上就可以解決,對不同遊戲相容性,這樣就能做到一個通用平台,能做到一個架構之上的架構。
轉自 http://www.php100.com/html/itnews/PHPxinwen/2011/0512/8043.html