每個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服務,最前端我們用兩臺服務器去進行均衡,下面比較大的業務像一些論壇,或者是游戲活動PHPweb批量添加欄目,單獨畫一組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開發,我們通過一個加密協議進行訪問。我們通過多個游戲進程進行訪問,包括開發一些指令PHPweb批量刪除關鍵詞,發送一些信號,在和他游戲通信,有我們可以監控進程存在,這個進程和通訊是否正常。
可能有這樣一種情況,一個是游戲進程存在,假如因為游戲內部僵死了,這時候我們通過一個PHP心跳,游戲服務端進程服務,就認為這個服務端進程是存活的。從外部去管理游戲服務器,這一塊我們涉及到一個時間問題。因為我們外部程序需要時間非常快,我發布一個停滯指令,在游戲服務器需要從網端去建立用戶一些連接,還有保存一些用戶數據,他完成整個過程才能把整個游戲服務端停掉,如果引入比較多,保證數據可能是幾十秒到1分鐘,從前端外部用戶去進行介入會發現超時情況,外部需要做一個操作馬上能夠完成。這樣我們去設計接口的時候,我們從PHP管理界面,我們發起一個功能接口,這個功能接口就進行轉發,這個請求完成,去通知各個游戲進程做一個評估操作,做完評估操作之后發起一個新的請求去回掉這邊PHP功能接口,這樣的話就變成一個異步過程。
下面是一個數據交互過程,分為四項功能。一個是運營指令,涉及到修改經驗倍數,踢人,發消息廣播,啟動游戲,停止游戲、更新游戲程序,更新配置文件、并服。第二個是服務器監控,包括CPU、磁盤、內存、進程數、系統負載、游戲服務端進程是否存在。游戲心跳檢測,Ping包檢測,確定游戲是否正常運行PHPweb批量更新文章,還有游戲在線人數,查看游戲總在線人數。
我們在開發這套平臺的時候遇到這種情況,一套程序需要不同游戲服務端架構。現在我們還帶領別的公司一些游戲,帶領別的公司游戲服務端架構不一樣,這樣的話我們去怎樣用一套平臺去適應每一個游戲工作室,或者游戲開發公司架構呢。前期我們肯定是考慮這樣一個方法,我們提供一個IPI接口,制定一個游戲,按照他們都要按照這個協議,按照這個IPI接口進行接入。到實際進行開發的時候會發現遇到一些問題,我們在各種游戲需要接入運營系統的時候,這個游戲基本上已經成型了,到綠色狀態。他們每個游戲可能需要進行一些,他們也會利用一些框架進行開發,包括GSP協議框架,他們已經封裝好了,馬上可以按照我們這個協議去做。
如果按照我們提供的接口來開發,可能從時間上,成本上都會存在一個問題。這就是我們進行一個舉例,我們如果派大巴車去接,有些人說我喜歡自己開車過來,可能別的人喜歡騎摩托車過來,這就代表這封裝一些框架,對協議的處理都不一樣。可能也有比較愿意接受這套方案的,這樣的話為了能夠讓每一個游戲研發公司都能夠去適應我們這個平臺進行快速接入,我們就需要對接口方案進行改造。
這就有點像我們開車一樣,我們來派大巴車去接方案,我們改了一個更開闊的方案PHPweb批量助手,我們和各個游戲進行,你們只要使用PHP協議和我們通訊就可以了,我們去做一個道路設計。我們修一條公路,你們想開奧迪寶馬都可以,想騎摩托車過來也都可以,我們會制定一個協議事例,你想按照這套事例來都可以。這樣每個游戲需要遵循我們這個平臺,但是這樣的話也需要一些約束,比如我要開飛機過來肯定不行,雖然可以給他們更寬松的制約,但是也需要遵守一些規定,比如你開車過來不能闖紅燈,需要遵守一些交通規則。我們會根據不同游戲,可以分為二進制協議,因為的話制定二進制協議,PHP是一個流媒體秀逸我們需要進行分包,有些游戲在一個協議包中間某兩個字節表示游戲包長度。我們通過配置文件,去設定對二進制要求。
最終每個協議不同,運行系統需要解析出來這部分過程,放到左邊PHP功能結構。PHP開發非常迅速,我們同樣去解析他一個歇息也會非常迅速。他通過一個 PHP流動協議,我們去進行一個轉化,轉化成一個IP請求,這樣PHP只要能夠對他游戲協議進行一個解析,這樣就可以輕松地完成。可能解析代碼非常簡單,這塊從開發層面來說非常快了。我們在3月份的介入三款游戲,同一時間同時介入,最后同一時期完成介入,這也是從結構設計來設定的。
文章地址:http://www.meyanliao.com/article/other/mgPHPbbdjxtyzhjsjdPHPdmsxfb.html