這篇文章將為大家詳細講解有關swoole在php中的用場景,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
10余年的長壽網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網(wǎng)絡營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整長壽建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“長壽網(wǎng)站設計”,“長壽網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
概述:
Swoole是一個面向生產(chǎn)環(huán)境的 PHP 異步網(wǎng)絡通信引擎,使 PHP 開發(fā)人員可以編寫高性能的異步并發(fā) TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole 可以廣泛應用于互聯(lián)網(wǎng)、移動通信、企業(yè)軟件、云計算、網(wǎng)絡游戲、物聯(lián)網(wǎng)(IOT)、車聯(lián)網(wǎng)、智能家居等領域。 使用 PHP + Swoole 作為網(wǎng)絡通信框架,可以使企業(yè) IT 研發(fā)團隊的效率大大提升。
php使用swoole的應用場景有:
場景1 - 實時收集定位數(shù)據(jù)實時輸出(例 滴滴司機行駛軌跡)
說明:
需要將所有的定位設備實時的接收,將實時的軌跡記錄顯示在地圖上
注意點:
第一點:
web1服務器 連接的用戶1,2,3,web1廣播信息時只能廣播用戶1,2,3,不能廣播web2連接的用戶4,5,6,假設場景是聊天,用戶1發(fā)送一消息,只有web1 服務器的用戶能看到,web2的用戶全部不能收到
第二點:消息的頻率控制,例:100個設備,100個用戶, 100個設備每秒上傳一條數(shù)據(jù),需要實時廣播給每個用戶,就是每秒要100*100 = 1W次,所以可以匯總每秒數(shù)據(jù)廣播給所有用戶等等方法
場景2 - 只收集定位設備入庫
說明:需要把所有的定位設備上傳的數(shù)據(jù)入庫,設備7個,每秒一條數(shù)據(jù),個人使用swoole 的task 函數(shù)(投遞一個異步的任務到 task_worker池中,此函數(shù)是非阻塞的, worker進程數(shù)同樣可以配置) 后調(diào)用接口方式入庫
服務器內(nèi)存報警問題
原因: 在于swoole_server->task
函數(shù)
官方介紹task底層使用Unix Socket管道通信,是全內(nèi)存的,沒有IO消耗。單進程讀寫性能可達100萬/s,不同的進程使用不同的管道通信,可以最大化利用多核。
但這任務如果是調(diào)用程序接口時,由于網(wǎng)絡的延遲,增加的任務大于消費的任務時,內(nèi)存占用會不斷的增加,導致服務器的內(nèi)存被占滿。
解決方法:消息針對入任務的頻率控制,可以根據(jù)自己的業(yè)務場景定義這個時間與是否可延遲等情況,匯總1秒內(nèi)的所有數(shù)據(jù)再調(diào)用程序接口(匯總時個人使用redis),最好能直接入庫,不必調(diào)用接口
簡單代碼片段
function __construct($config) { $this->config = $config; $this->serv = new Swoole\Server($config['server']['host'], $config['server']['port']); // 連接redis $this->redis = new Predis\Client($config['redis']); $this->storage = new Storage($this->config); $this->serv->set([ 'worker_num' => $this->config['server']['workerNum'], //工作進程數(shù)量 'daemonize' => $this->config['server']['daemonize'], //是否作為守護進程 'task_worker_num' => $this->config['server']['taskWorkerNum'], ]); $this->serv->on('connect', function ($serv, $fd){ $this->onConnect($fd, $serv); }); $this->serv->on('receive', function ($serv, $fd, $from_id, $data) { $this->onReceive($fd, $serv, $data); }); $this->serv->on('Close', function($server, $fd) { $this->onClose($fd, $server); }); $this->serv->on('Task', function($server, $task_id, $from_id, $data) { $this->onTask($server, $task_id, $from_id, $data); }); $this->serv->on('Finish', function($server, $task_id, $data) { $this->onFinish($server, $task_id, $data); }); $this->serv->start(); } public function onTask($serv, $task_id, $from_id, $data){ // insert 方法是通過接口入庫 $this->storage->insert($data); } public function onReceive($fd, $serv, $data) { $this->storage->writeLog('message:'.$data); $data = $this->formatData($data, $fd); $serv->task($data); } public function onClose($fd, $serv) { // writeLog 方法是寫入log $this->storage->writeLog('close fd:'.$fd); } public function onFinish($serv, $task_id, $data) { return ''; }
關于swoole在php中的用場景就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。