PHP小蝌蚪游戲也是可以分布式部署的。
1、充分綜合利用資源,并行計算處理,高性能
2、避免單點故障造成的整個系統(tǒng)崩潰
3、提高系統(tǒng)整體承載能力
4、節(jié)約成本
關于第4點節(jié)約成本:拿小蝌蚪游戲來說,小蝌蚪由于游戲自身的特點對于CPU及內存要求不高,但是會比較消耗的服務器帶寬。小蝌蚪使用的服務器是兩臺阿里云的低配(單核+500M內存+[b]5M帶寬[/b])云主機價格為2x157¥/月,同樣的帶寬如果選用單臺(單核+500M內存+[b]10M帶寬[/b])服務器則需要1*657¥/月。所以選擇兩臺低配5M帶寬的服務器要比單臺劃算很多,后面如果還需要擴容則增加低配置服務器即可,所以支持分布式部署會節(jié)約不少成本,既拿很多低配機器撐起海量請求。
首先了解下phpgame框架的進程模型
phpgame框架分為兩組進程gateway進程和worker進程(分別對應workers下的gateway.php和worker.php)
gateway進程只[b]負責網(wǎng)絡IO[/b],gateway進程是異步非阻塞的。gateway具體職責是
1、hold住客戶端連接
2、并將客戶端發(fā)來的數(shù)據(jù)轉發(fā)給worker進程處理
3、接收worker進程的處理結果并發(fā)送給客戶端
worker進程主要職責是處理用戶請求,具體如下
1、接收gateway進程socket轉發(fā)來的用戶請求
2、處理請求
3、如果有需要,通過socket向gateway發(fā)送結果數(shù)據(jù),gateway將結果數(shù)據(jù)再轉發(fā)給用戶
那么基于這種進程模型可以看到,gateway進程和worker進程是可以分開部署在不同機器上,這為我們分布式部署提供了便利。
所以當小蝌蚪帶寬資源不足時,可以簡單的增加gateway的機器,然后配置gateway進程將請求轉發(fā)給同一臺worker機器即可,這樣就實現(xiàn)了增加低配服務器提高接入服務器帶寬的目的,節(jié)約了成本又大大的增加了系統(tǒng)的承載能力。
1、首先前端配置,根據(jù)當前域名判斷是否使用多個接入機
applications/Todpole/Web/js/Setting.js
var Settings = function() {
// [b]如果是workerman.net phpgame.cn域名 則采用多個接入端隨機負載均衡[/b]
var domain_arr = ['workerman.net', 'phpgame.cn','wtbis.cn', 'www.phpgame.cn'];
if(0 >= $.inArray(document.domain, domain_arr)){
this.socketServer = 'ws://'+domain_arr[Math.floor(Math.random() * domain_arr.length + 1)-1]+':8280';
}
else{
// 運行在其它域名上
this.socketServer = 'ws://'+document.domain+':8280';
}
}
2、服務端配置
gateway接入機的配置 conf/conf.d/Gateway.conf
[code]
listen = tcp://0.0.0.0:8280
persistent_connection = 1
start_workers = 5
user = www-data
preread_length = 65535
;[b]本機內網(wǎng)ip[/b]
lan_ip = [b][i]本gateway接入機IP[/b][/i]
lan_port_start = 20000
;[b]worker進程的ip[/b]
game_worker[] = udp://[b][i]worker機器IP[/b][/i]:8183
[/code]
worker業(yè)務邏輯機器的配置
[code]
;確認worker監(jiān)聽的ip是0.0.0.0,最好是本機內網(wǎng)ip
listen = udp://[b][i]0.0.0.0[/b][/i]:8183
start_workers = 5
user = www-data
preread_length = 23
max_requests=1000
[/code]
3、替換原applications/Todpole/Store.php的內容如下:
class Store
{
protected static $instance = null;
public static function connect()
{
if(!self::$instance)
{
self::$instance = new Memcache;
self::$instance->addServer('[b]memcache內網(wǎng)機器IP[/b]', 11211);
}
return self::$instance;
}
public static function set($key, $value, $ttl = 0)
{
if(self::connect())
{
return self::$instance->set($key, $value, $ttl);
}
return false;
}
public static function get($key)
{
if(self::connect())
{
return self::$instance->get($key);
}
return false;
}
public static function delete($key)
{
if(self::connect())
{
return self::$instance->delete($key);
}
return false;
}
public static function deleteAll()
{
}
}
4、安裝memcahced (debian系統(tǒng)運行命令 apt-get install memcached)
此時memcached可能已經(jīng)運行起來了,可以先kill掉,然后運行 /usr/bin/memcached -m 128 -p 11211 -u nobody -l 0.0.0.0 -D 啟動memcahced服務
給php安裝memcache擴展(debian系統(tǒng)運行命令 apt-get install php5-memcache)
好了,重啟服務,大功告成!
workerman的標準配置文件中gateway.conf好象沒有下面這幾個參數(shù)???是另外擴充的嗎?
;本機內網(wǎng)ip
lan_ip = 本gateway接入機IP
lan_port_start = 20000
;worker進程的ip
game_worker[] = udp://worker機器IP:8183
這個是比較老的帖子了
現(xiàn)在分布式部署可以參考手冊
http://doc.workerman.net/advanced/distributed.html
牛逼啊