淺談workerman中worker類的用法

本篇文章給大家介紹一下workerman,以及談?wù)?a >workerman中worker類的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

淺談workerman中worker類的用法

相關(guān)推薦:《workerman

什么是workerman?

Workerman是一款開源高性能異步PHP socket 即時通訊框架。支持高并發(fā),超高穩(wěn)定性,被廣泛的用于手機(jī)app、移動通訊,微信小程序,手游服務(wù)端、網(wǎng)絡(luò)游戲、PHP聊天室、硬件通訊、智能家居、車聯(lián)網(wǎng)、物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)。 支持TCP長連接,支持Websocket、HTTP等協(xié)議,支持自定義協(xié)議。擁有異步Mysql、異步Redis、異步Http、MQTT物聯(lián)網(wǎng)客戶端、異步消息隊列等眾多高性能組件。

官網(wǎng):https://www.workerman.net/

workerman的特性

純PHP開發(fā)? ?
支持PHP多進(jìn)程
支持TCP、UDP
支持長連接
支持各種應(yīng)用層協(xié)議
支持高并發(fā)
支持服務(wù)平滑重啟
支持HHVM
支持以指定用戶運(yùn)行子進(jìn)程
自帶監(jiān)控
支持毫秒級別定時器
支持異步IO
支持對象或者資源永久保持
高性能
支持分布式部署
支持心跳檢測

workerman應(yīng)用場景

淺談workerman中worker類的用法

workerman安裝

環(huán)境要求:

workerman從3.5.3版本開始已經(jīng)能夠同時支持linux系統(tǒng)和windows系統(tǒng)。

需要PHP>=5.3.3,并配置好PHP的環(huán)境變量。

注意? 本教程 使用linux? 不會講windows? 實際使用 也不推薦用 windows系統(tǒng)

Linux??? lnmp一鍵安裝腳本

1、安裝PHP>=5.3.3,并安裝了pcntl、posix擴(kuò)展?? –enable-pcntl? –enable-posix
2、建議安裝event或者libevent擴(kuò)展,但不是必須的(注意event擴(kuò)展需要PHP>=5.4)

curl -Ss http://www.workerman.net/check.php | php

淺談workerman中worker類的用法

git clone https://github.com/walkor/Workerman

安裝libevent

yum install libevent-devel

php版本在7以下
wget? http://pecl.php.net/get/libevent-0.1.0.tgz

注意目前l(fā)ibevent擴(kuò)展不支持php7,php7用戶只能使用Event擴(kuò)展。

wget? http://pecl.php.net/get/event-2.4.3.tgz

解壓? 編譯
/user/local/php/bin/phpize
./configure? –with-php-config=/usr/local/php/bin/php-config
make? && make install

配置到 php.ini

workerman目錄結(jié)構(gòu)

淺談workerman中worker類的用法
workerman簡單開發(fā)demo

實現(xiàn)簡單的http服務(wù)器

require_once??'workman/Autoloader.php';  use?WorkermanWorker;  $http_work?=?new?Worker('http://0.0.0.0:1111’);  $http_work->onMessage?=?function($conn,$data){  ????????$conn->send('hello?workman'); };  Worker::runAll();  瀏覽器?訪問??ip:1111??即可

實現(xiàn)websocket

ws.php

require_once??'workman/Autoloader.php'; use?WorkermanWorker; $http_work?=?new?Worker('websocket://0.0.0.0:2222'); $http_work-&gt;onMessage?=?function($conn,$data){ ????????$conn-&gt;send('hello?workman'.$data); }; Worker::runAll();   nbsp;HTML&gt;    <script>         ws = new WebSocket("ws://192.168.113.136:2222");         ws.onopen = function(){            ws.send(&#39;lampol&#39;);         }          ws.onmessage = function(e){                 console.log(e.data)         }  </script>

workerman原理

淺談workerman中worker類的用法

淺談workerman中worker類的用法

Worker類

WorkerMan中有兩個重要的類Worker與Connection。
Worker類用于實現(xiàn)端口的監(jiān)聽,并可以設(shè)置客戶端連接事件、連接上消息事件、連接斷開事件的回調(diào)函數(shù),從而實現(xiàn)業(yè)務(wù)處理。

$worker = new Worker($listen,$context);? //實例化? 返回對象

$listen 的格式為 ://

可以為以下格式:

tcp: 例如 tcp://0.0.0.0:8686

udp: 例如 udp://0.0.0.0:8686

unix: 例如 unix:///tmp/my_file (需要Workerman>=3.2.7)

http: 例如 http://0.0.0.0:80

websocket: 例如 websocket://0.0.0.0:8686

text: 例如 text://0.0.0.0:8686 (text是Workerman內(nèi)置的文本協(xié)議,兼容telnet,詳情參見附錄Text協(xié)議部分)

$context 用于傳遞socket的上下文選項

Worker類屬性

count

設(shè)置當(dāng)前Worker實例啟動多少個進(jìn)程,不設(shè)置時默認(rèn)為1。

此屬性必須在Worker::runAll();運(yùn)行前設(shè)置才有效。windows系統(tǒng)不支持此特性。

進(jìn)程數(shù)設(shè)置依據(jù):

1、cpu核數(shù)

2、內(nèi)存大小

3、業(yè)務(wù)偏向IO密集還是CPU密集型

不清楚自己業(yè)務(wù)偏向于哪種類型,可設(shè)置進(jìn)程數(shù)為CPU核數(shù)的2倍左右即可。

lscpu??? top? ? 1? 查看cpu核數(shù)

id

當(dāng)前worker進(jìn)程的id編號,范圍為0到$worker->count-1。進(jìn)程重啟后id編號值是不變的。

name

設(shè)置當(dāng)前Worker實例的名稱,方便運(yùn)行status命令時識別進(jìn)程。不設(shè)置時默認(rèn)為none。

protocol
設(shè)置當(dāng)前Worker實例的協(xié)議類。

transport
設(shè)置當(dāng)前Worker實例所使用的傳輸層協(xié)議,目前只支持3種(tcp、udp、ssl)。不設(shè)置默認(rèn)為tcp。

daemonize
此屬性為全局靜態(tài)屬性,表示是否以daemon(守護(hù)進(jìn)程)方式運(yùn)行。如果啟動命令使用了 -d參數(shù),則該屬性會自動設(shè)置為true。也可以代碼中手動設(shè)置。

logFile

用來指定workerman日志文件位置。此文件記錄了workerman自身相關(guān)的日志,包括啟動、停止等。
Worker::$logFile = ‘/tmp/workerman.log’;

stdoutFile

此屬性為全局靜態(tài)屬性,如果以守護(hù)進(jìn)程方式(-d啟動)運(yùn)行,則所有向終端的輸出(echo var_dump等)都會被重定向到stdoutFile指定的文件中。
Worker::$stdoutFile = ‘test.log’;

pidFile
如果無特殊需要,建議不要設(shè)置此屬性
Worker::$pidFile = ‘/var/run/workerman.pid’;

user
設(shè)置當(dāng)前Worker實例以哪個用戶運(yùn)行。此屬性只有當(dāng)前用戶為root時才能生效。不設(shè)置時默認(rèn)以當(dāng)前用戶運(yùn)行。
建議$user設(shè)置權(quán)限較低的用戶,例如www-data、apache、nobody等。

connections

array(id=>connection, id=>connection, …)
此屬性中存儲了當(dāng)前進(jìn)程的所有的客戶端連接對象,其中id為connection的id編號

reloadable
設(shè)置當(dāng)前Worker實例是否可以reload,即收到reload信號后是否退出重啟。不設(shè)置默認(rèn)為true,收到reload信號后自動重啟進(jìn)程。

reusePort

設(shè)置當(dāng)前worker是否開啟監(jiān)聽端口復(fù)用(socket的SO_REUSEPORT選項),默認(rèn)為false,不開啟。

globalEvent
此屬性為全局靜態(tài)屬性,為全局的eventloop實例,可以向其注冊文件描述符的讀寫事件或者信號事件。

Worker類回調(diào)屬性

onWorkerStart

設(shè)置Worker子進(jìn)程啟動時的回調(diào)函數(shù),每個子進(jìn)程啟動時都會執(zhí)行。

回掉函數(shù)參數(shù) $worker? Worker 對象

$worker-&gt;onWorkerStart?=?function($worker){ ?????//代碼 };  $worker-&gt;onWorkerStart?=?'test’; function?test($worker){ ????????echo?'hhhhh'; }

onConnect

當(dāng)客戶端與Workerman建立連接時(TCP三次握手完成后)觸發(fā)的回調(diào)函數(shù)。每個連接只會觸發(fā)一次onConnect回調(diào)。

回調(diào)函數(shù)的參數(shù)

$connection

連接對象,即TcpConnection實例,用于操作客戶端連接,如發(fā)送數(shù)據(jù),關(guān)閉連接等

$worker-&gt;onConnect?=?function($connection){ ????????echo?'new?connect....'.$connection-&gt;getRemoteIp(); };

onMessage

當(dāng)客戶端通過連接發(fā)來數(shù)據(jù)時(Workerman收到數(shù)據(jù)時)觸發(fā)的回調(diào)函數(shù)

回調(diào)函數(shù)的參數(shù)

$connection
連接對象,即TcpConnection實例,用于操作客戶端連接,如發(fā)送數(shù)據(jù),關(guān)閉連接等

$data
客戶端連接上發(fā)來的數(shù)據(jù),如果Worker指定了協(xié)議,則$data是對應(yīng)協(xié)議decode(解碼)了的數(shù)據(jù)

$worker-&gt;onMessage?=?function($connection,$data){ ????????echo?$data; ????????$connection-&gt;send('hello?'.$data.PHP_EOL); };

onClose

當(dāng)客戶端連接與Workerman斷開時觸發(fā)的回調(diào)函數(shù)。不管連接是如何斷開的,只要斷開就會觸發(fā)onClose。每個連接只會觸發(fā)一次onClose。由于斷網(wǎng)或者斷電等極端情況斷開的連接 ,也就無法及時觸發(fā)onClose,這種情況需要通過應(yīng)用層心跳來解決

$worker-&gt;onClose?=?function($connection){ ????????echo?'connection?close'; };

onError
當(dāng)客戶端的連接上發(fā)生錯誤時觸發(fā)。

目前錯誤類型有

1、調(diào)用Connection::send由于客戶端連接斷開導(dǎo)致的失?。ňo接著會觸發(fā)onClose回調(diào)) (code:WORKERMAN_SEND_FAIL msg:client closed)

2、在觸發(fā)onBufferFull后(發(fā)送緩沖區(qū)已滿),仍然調(diào)用Connection::send,并且發(fā)送緩沖區(qū)仍然是滿的狀態(tài)導(dǎo)致發(fā)送失敗(不會觸發(fā)onClose回調(diào))(code:WORKERMAN_SEND_FAIL msg:send buffer full and drop package)

3、使用AsyncTcpConnection異步連接失敗時(緊接著會觸發(fā)onClose回調(diào)) (code:WORKERMAN_CONNECT_FAIL msg:stream_socket_client返回的錯誤消息)

onWorkerReload

此特性不常用到。

設(shè)置Worker收到reload信號后執(zhí)行的回調(diào)。

可以利用onWorkerReload回調(diào)做很多事情,例如在不需要重啟進(jìn)程的情況下重新加載業(yè)務(wù)配置文件。

onBufferFull

每個連接都有一個單獨(dú)的應(yīng)用層發(fā)送緩沖區(qū),如果客戶端接收速度小于服務(wù)端發(fā)送速度,數(shù)據(jù)會在應(yīng)用層緩沖區(qū)暫存,如果緩沖區(qū)滿則會觸發(fā)onBufferFull回調(diào)。

緩沖區(qū)大為TcpConnection::$maxSendBufferSize,默認(rèn)值為1MB,可以為當(dāng)前連接動態(tài)設(shè)置緩沖區(qū)大小例

onBufferDrain

每個連接都有一個單獨(dú)的應(yīng)用層發(fā)送緩沖區(qū),緩沖區(qū)大小由TcpConnection::$maxSendBufferSize決定,默認(rèn)值為1MB,可以手動設(shè)置更改大小,更改后會對所有連接生效。

Worker類接口方法

runAll

運(yùn)行所有Worker實例。

Worker::runAll()執(zhí)行后將永久阻塞,也就是說位于Worker::runAll()后面的代碼將不會被執(zhí)行。所有Worker實例化應(yīng)該都在Worker::runAll()前進(jìn)行。

stopAll

停止當(dāng)前進(jìn)程(子進(jìn)程)的所有Worker實例并退出。
此方法用于安全退出當(dāng)前子進(jìn)程,作用相當(dāng)于調(diào)用exit/die退出當(dāng)前子進(jìn)程。

listen

用于實例化Worker后執(zhí)行監(jiān)聽。

Worker類代碼流程分析

public?function?__construct($socket_name?=?'',?$context_option?=?array())  public?static?function?runAll() { ????static::checkSapiEnv();?????//檢測命令行模式 ????static::init();??????????????????????//初始化日志?pid??workid… ????static::lock();?????????????????????//啟動文件?加鎖?獨(dú)占鎖 ????static::parseCommand();??//解析命令??start???stop??restart??… ????static::daemonize();??????????//守護(hù)進(jìn)程運(yùn)行 ????static::initWorkers();??????????//初始化?所有worker?實例 ????static::installSignal();?????????//安裝信號 ????static::saveMasterPid();????//保存主進(jìn)程id ????static::unlock();??????????????????//解鎖 ????static::displayUI();??????????????//展示UI ????static::forkWorkers();??????????//fork?進(jìn)程 ????static::resetStd();????????????????//重置輸入輸出 ????static::monitorWorkers();????//主進(jìn)程監(jiān)控各個worker的狀態(tài) }

SAPI(Server Application Programming Interface)服務(wù)器應(yīng)用程序編程接口,即PHP與其他應(yīng)用交互的接口,PHP腳本要執(zhí)行有很多方式,通過Web服務(wù)器,或者直接在命令行下,也可以嵌入在其他程序中。

常見的SAPI有:cgi、fast-cgi、cli、apache模塊的DLL、isapi

Linux 常用SIG信號及其鍵值

01 SIGHUP 掛起(hangup)
02 SIGINT 中斷,當(dāng)用戶從鍵盤按^c鍵或^break鍵時
03 SIGQUIT 退出,當(dāng)用戶從鍵盤按quit鍵時
04 SIGILL 非法指令
05 SIGTRAP 跟蹤陷阱(trace trap),啟動進(jìn)程,跟蹤代碼的執(zhí)行
06 SIGIOT IOT指令
07 SIGEMT EMT指令
08 SIGFPE 浮點(diǎn)運(yùn)算溢出
09 SIGKILL 殺死、終止進(jìn)程
10 SIGBUS 總線錯誤
11 SIGSEGV 段違例(segmentation? violation),進(jìn)程試圖去訪問其虛地址空間以外的位置
12 SIGSYS 系統(tǒng)調(diào)用中參數(shù)錯,如系統(tǒng)調(diào)用號非法
13 SIGPIPE 向某個非讀管道中寫入數(shù)據(jù)
14 SIGALRM 鬧鐘。當(dāng)某進(jìn)程希望在某時間后接收信號時發(fā)此信號
15 SIGTERM 軟件終止(software? termination)
16 SIGUSR1 用戶自定義信號1
17 SIGUSR2 用戶自定義信號2
18 SIGCLD 某個子進(jìn)程死

更多計算機(jī)編程相關(guān)知識,請訪問:workerman??!

以上就是淺談

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享