在線用戶處理:
方案(一):https://wiki.swoole.com/wiki/...(推薦)
方案(二)redis方案,無序集合Set
方案(三)swoole-tablephp
/** * 監聽ws鏈接事件 * @param $ws * @param $request */ public function onOpen($ws, $request) { // fd redis [1] \app\common\lib\redis\Predis::getInstance()->sAdd(config('redis.live_game_key'), $request->fd); var_dump($request->fd); } /** * 監聽ws消息事件 * @param $ws * @param $frame */ public function onMessage($ws, $frame) { echo "ser-push-message:{$frame->data}\n"; $ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s")); } /** * close * @param $ws * @param $fd */ public function onClose($ws, $fd) { // fd del \app\common\lib\redis\Predis::getInstance()->sRem(config('redis.live_game_key'), $fd); echo "clientid:{$fd}\n"; }
// 獲取鏈接的用戶 // 賽況的基本信息入庫 二、數據組織好 push到直播頁面 $taskData = [ 'method' => 'pushLive', 'data' => $data ]; $_POST['http_server']->task($taskData);
/** * 經過task機制發送賽況實時數據給客戶端 * @param $data * @param $serv swoole server對象 */ public function pushLive($data, $serv) { $clients = Predis::getInstance()->sMembers(config("redis.live_game_key")); foreach($clients as $fd) { $serv->push($fd, json_encode($data)); } }
/** * 基礎類庫優化,優化兩個參數的方法(重要) * 1.集合的添加和刪除 * @param $name * @param $arguments * @return array */ public function __call($name, $arguments) { //echo $name.PHP_EOL; //print_r($arguments); if(count($arguments) != 2) { return ''; } $this->redis->$name($arguments[0], $arguments[1]); }
Tips:
關閉服務後,清除Redis
中全部客戶端的id
css
$this->ws = new swoole_websocket_server(self::HOST, self::PORT); $this->ws->listen(self::HOST, self::CHART_PORT, SWOOLE_SOCK_TCP);
//推薦使用connections這種方式,redis方式也能夠 foreach($_POST['http_server']->ports[1]->connections as $fd) { $_POST['http_server']->push($fd, json_encode($data)); }
/** * 監控服務 ws http 9911 */ class Server { const PORT = 9911; public function port() { $shell = "netstat -anp 2>/dev/null | grep ". self::PORT . " | grep LISTEN | wc -l"; $result = shell_exec($shell); if($result != 1) { // 發送報警服務 郵件 短信 /// todo echo date("Ymd H:i:s")."error".PHP_EOL; } else { echo date("Ymd H:i:s")."succss".PHP_EOL; } } } // 每2秒執行一次 swoole_timer_tick(2000, function($timer_id) { (new Server())->port(); echo "time-start".PHP_EOL; });
以‘守護進程’方式在後臺執行:html
nohup /usr/local/php/bin/php /home/wwwroot/swoole/thinkphp/extend/swoole/monitor/server.php > /home/wwwlog/monitor.log &
檢測:linux
/** * 設置進程名,爲後續平滑重啓進程 * @param $server */ public function onStart($server) { swoole_set_process_name("live_master"); }
reload.shnginx
echo "loading..." pid=`pidof live_master` echo $pid kill -USR1 $pid echo "loading success" # linux 信號控制:USR1 平滑重載全部worker進程並從新載入配置和二進制模塊
if (!-e $request_filename ) { proxy_pass http://127.0.0.1:9911; }
負載均衡:nginx
必須是單臺,其實nginx
特別耗費cpu
,須要測試nginx
的轉發量web
代理 - 代爲辦理(如代理理財、代理收貨等等)
一、正向代理:redis
二、反向代理:thinkphp
模擬down
和backup
可經過關閉端口:iptables -I INPUT -p tcp --dport 8003 -j DROP
清理規則:iptables -F
ip_hash
:解決了不一樣請求打到不一樣服務器問題,從而保證了session
和cookie
的一致性。缺點:
客戶端可能會再用一層代理
**shell
url_hash:json
完!