這篇文章跟大家介紹一下workerman,以及談?wù)剋orkerman中worker類別的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
相關(guān)推薦:《workerman教學(xué)》
什麼是workerman?
Workerman是一款開源高效能非同步PHP socket 即時通訊框架。支援高並發(fā),超高穩(wěn)定性,被廣泛的用於手機(jī)app、行動通訊,微信小程序,手遊服務(wù)端、網(wǎng)路遊戲、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多重流程
支援TCP、UDP
支援長連線
支援各種應(yīng)用層協(xié)定
支援高並發(fā)
支援服務(wù)平滑重啟
支援HHVM
支援以指定使用者執(zhí)行子程序
自帶監(jiān)控
支援毫秒級定時器
支援非同步IO
支援物件或資源永久保持
高效能
支援分散式部署
支援心跳偵測
workerman應(yīng)用程式場景
workerman安裝
環(huán)境需求:
#workerman從3.5.3版本開始已經(jīng)能夠同時支援linux系統(tǒng)和windows系統(tǒng)。
需要PHP>=5.3.3,並且配置好PHP的環(huán)境變數(shù)。
注意? 本教學(xué)使用linux? 不會講windows? 實(shí)際使用也不建議用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
#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簡單開發(fā)demo
實(shí)作簡單的http伺服器
require_once 'workman/Autoloader.php'; use \Workerman\Worker; $http_work = new Worker('http://0.0.0.0:1111’); $http_work->onMessage = function($conn,$data){ $conn->send('hello workman'); }; Worker::runAll(); 瀏覽器 訪問 ip:1111 即可
實(shí)作websocket
ws.php
require_once 'workman/Autoloader.php'; use \Workerman\Worker; $http_work = new Worker('websocket://0.0.0.0:2222'); $http_work->onMessage = function($conn,$data){ $conn->send('hello workman'.$data); }; Worker::runAll(); <!DOCTYPE HTML> <html> <body> <script> ws = new WebSocket("ws://192.168.113.136:2222"); ws.onopen = function(){ ws.send('lampol'); } ws.onmessage = function(e){ console.log(e.data) } </script> </body> </html>
workerman原理
Worker類別
WorkerMan中有兩個重要的類別Worker與Connection。
Worker類別用於實(shí)現(xiàn)連接埠的監(jiān)聽,並可設(shè)定客戶端連線事件、連線上訊息事件、連線中斷事件的回呼函數(shù),進(jìn)而實(shí)現(xiàn)業(yè)務(wù)處理。
$worker = new Worker($listen,$context);? //實(shí)例化? 回傳物件
$listen 的格式為<協(xié)定>://<監(jiān)聽位址>
<協(xié)定> 可以是以下格式:
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è)定目前Worker實(shí)例啟動多少個進(jìn)程,不設(shè)定時預(yù)設(shè)為1。 此屬性必須在Worker::runAll();運(yùn)行前設(shè)定才有效。 windows系統(tǒng)不支援此特性。 進(jìn)程數(shù)設(shè)定依據(jù):1、cpu核數(shù)2、記憶體大小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實(shí)例的名稱,方便運(yùn)行status命令時識別進(jìn)程。不設(shè)置時默認(rèn)為none。
protocol
設(shè)置當(dāng)前Worker實(shí)例的協(xié)議類。
transport
設(shè)置當(dāng)前Worker實(shí)例所使用的傳輸層協(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實(shí)例以哪個用戶運(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實(shí)例是否可以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實(shí)例,可以向其注冊文件描述符的讀寫事件或者信號事件。
Worker類回調(diào)屬性
onWorkerStart
設(shè)置Worker子進(jìn)程啟動時的回調(diào)函數(shù),每個子進(jìn)程啟動時都會執(zhí)行。
回掉函數(shù)參數(shù) $worker Worker 對象
$worker->onWorkerStart = function($worker){ //代碼 }; $worker->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實(shí)例,用于操作客戶端連接,如發(fā)送數(shù)據(jù),關(guān)閉連接等
$worker->onConnect = function($connection){ echo 'new connect....'.$connection->getRemoteIp(); };
onMessage
當(dāng)客戶端通過連接發(fā)來數(shù)據(jù)時(Workerman收到數(shù)據(jù)時)觸發(fā)的回調(diào)函數(shù)
回調(diào)函數(shù)的參數(shù)
$connection
連接對象,即TcpConnection實(shí)例,用于操作客戶端連接,如發(fā)送數(shù)據(jù),關(guān)閉連接等
$data
客戶端連接上發(fā)來的數(shù)據(jù),如果Worker指定了協(xié)議,則$data是對應(yīng)協(xié)議decode(解碼)了的數(shù)據(jù)
$worker->onMessage = function($connection,$data){ echo $data; $connection->send('hello '.$data.PHP_EOL); };
onClose
當(dāng)客戶端連接與Workerman斷開時觸發(fā)的回調(diào)函數(shù)。不管連接是如何斷開的,只要斷開就會觸發(fā)onClose。每個連接只會觸發(fā)一次onClose。由于斷網(wǎng)或者斷電等極端情況斷開的連接 ,也就無法及時觸發(fā)onClose,這種情況需要通過應(yīng)用層心跳來解決
$worker->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實(shí)例。
Worker::runAll()執(zhí)行后將永久阻塞,也就是說位于Worker::runAll()后面的代碼將不會被執(zhí)行。所有Worker實(shí)例化應(yīng)該都在Worker::runAll()前進(jìn)行。
stopAll
停止當(dāng)前進(jìn)程(子進(jìn)程)的所有Worker實(shí)例并退出。
此方法用于安全退出當(dāng)前子進(jìn)程,作用相當(dāng)于調(diào)用exit/die退出當(dāng)前子進(jìn)程。
listen
用于實(shí)例化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 實(shí)例 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中worker類的用法的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

實(shí)現(xiàn)Workerman文件中的文件上傳與下載,需要具體程式碼範(fàn)例引言:Workerman是一款高效能的PHP非同步網(wǎng)路通訊框架,具備簡潔、高效、易用等特點(diǎn)。在實(shí)際開發(fā)中,文件上傳和下載是常見的功能需求,本文將介紹如何使用Workerman框架實(shí)現(xiàn)文件的上傳和下載,並給出具體的程式碼範(fàn)例。一、檔案上傳:檔案上傳是指將本機(jī)上的檔案傳輸至伺服器端的操作。下面是使用

Swoole 和 Workerman 都是高效能 PHP 伺服器框架。 Swoole 以其非同步處理、出色的效能和可擴(kuò)展性而聞名,適用於需要處理大量並發(fā)請求和高吞吐量的專案。 Workerman 提供了非同步和同步模式的靈活性,具有直覺的 API,更適合易用性和處理較低並發(fā)量的專案。

如何實(shí)現(xiàn)Workerman文件的基本使用方法簡介:Workerman是一個高效能的PHP開發(fā)框架,它可以幫助開發(fā)者輕鬆建立高並發(fā)的網(wǎng)路應(yīng)用程式。本文將介紹Workerman的基本使用方法,包括安裝和設(shè)定、建立服務(wù)和監(jiān)聽連接埠、處理客戶端請求等。並給出相應(yīng)的程式碼範(fàn)例。一、安裝並設(shè)定Workerman在命令列中輸入以下命令來安裝Workerman:c

如何實(shí)現(xiàn)Workerman文件中的定時器功能Workerman是一款強(qiáng)大的PHP非同步網(wǎng)路通訊框架,它提供了豐富的功能,其中就包括定時器功能。使用定時器可以在指定的時間間隔內(nèi)執(zhí)行程式碼,非常適合定時任務(wù)、輪詢等應(yīng)用程式場景。接下來,我將詳細(xì)介紹如何在Workerman中實(shí)現(xiàn)定時器功能,並提供具體的程式碼範(fàn)例。第一步:安裝Workerman首先,我們需要安裝Worker

Workerman開發(fā):基於UDP協(xié)議的即時視訊通話摘要:本文將介紹如何使用Workerman框架實(shí)現(xiàn)基於UDP協(xié)議的即時視訊通話功能。我們將深入了解UDP協(xié)議的特點(diǎn),並透過程式碼範(fàn)例展示如何建立一個簡單但完整的即時視訊通話應(yīng)用程式。引言:在網(wǎng)路通訊中,即時視訊通話是一項非常重要的功能。傳統(tǒng)的TCP協(xié)定在實(shí)現(xiàn)即時性較高的視訊通話時,可能會有傳輸延遲等問題。而UDP

如何實(shí)現(xiàn)Workerman文件中的反向代理功能,需要具體程式碼範(fàn)例簡介:Workerman是一款高效能的PHP多進(jìn)程網(wǎng)路通訊框架,提供了豐富的功能和強(qiáng)大的效能,廣泛應(yīng)用於Web即時通訊、長連接服務(wù)等場景。其中,Workerman也支援反向代理功能,可實(shí)現(xiàn)伺服器對外提供服務(wù)時的負(fù)載平衡和靜態(tài)資源快取等功能。本篇文章將介紹如何使用Workerman實(shí)現(xiàn)反向代理功

如何使用Workerman建立高可用性負(fù)載平衡系統(tǒng),需要具體程式碼範(fàn)例在現(xiàn)代技術(shù)領(lǐng)域中,隨著網(wǎng)路的快速發(fā)展,越來越多的網(wǎng)站和應(yīng)用程式需要處理大量的並發(fā)請求。為了實(shí)現(xiàn)高可用性和高效能,負(fù)載平衡系統(tǒng)成為了必不可少的組件之一。本文將介紹如何使用PHP開源框架Workerman建構(gòu)一個高可用性的負(fù)載平衡系統(tǒng),並提供具體的程式碼範(fàn)例。一、Workerman簡介Worke

Workerman是基於PHP開發(fā)的高效能非同步事件驅(qū)動框架,它可以輕鬆實(shí)現(xiàn)TCP/UDP協(xié)定下的長連線開發(fā)。除此之外,Workerman也提供了實(shí)現(xiàn)檔案傳輸?shù)墓δ?,可以用於大檔案傳輸、資料備份等場景。本文將介紹如何在Workerman中實(shí)現(xiàn)檔案傳輸功能,並提供具體的程式碼範(fàn)例。一、文件上傳功能實(shí)現(xiàn)文件上傳功能需要客戶端將要上傳的文件傳送給服務(wù)端,服務(wù)端驗(yàn)證
