溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

workerman中worker類怎么用

發(fā)布時(shí)間:2021-02-03 14:42:57 來源:億速云 閱讀:384 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)workerman中worker類怎么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

什么是workerman?

Workerman是一款開源高性能異步PHP socket 即時(shí)通訊框架。支持高并發(fā),超高穩(wěn)定性,被廣泛的用于手機(jī)app、移動(dòng)通訊,微信小程序,手游服務(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)客戶端、異步消息隊(duì)列等眾多高性能組件。

官網(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)控
支持毫秒級(jí)別定時(shí)器
支持異步IO
支持對(duì)象或者資源永久保持
高性能
支持分布式部署
支持心跳檢測(cè)

workerman應(yīng)用場(chǎng)景

workerman中worker類怎么用

workerman安裝

環(huán)境要求:

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

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

注意  本教程 使用linux  不會(huì)講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

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

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

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í)現(xiàn)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原理

workerman中worker類怎么用

workerman中worker類怎么用

Worker類

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

$worker = new Worker($listen,$context);  //實(shí)例化  返回對(duì)象

$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的上下文選項(xiàng)

Worker類屬性

count

設(shè)置當(dāng)前Worker實(shí)例啟動(dòng)多少個(gè)進(jìn)程,不設(shè)置時(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編號(hào),范圍為0到$worker->count-1。進(jìn)程重啟后id編號(hào)值是不變的。

name

設(shè)置當(dāng)前Worker實(shí)例的名稱,方便運(yùn)行status命令時(shí)識(shí)別進(jìn)程。不設(shè)置時(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òng)命令使用了 -d參數(shù),則該屬性會(huì)自動(dòng)設(shè)置為true。也可以代碼中手動(dòng)設(shè)置。

logFile

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

stdoutFile

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

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

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

connections

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

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

reusePort

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

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

Worker類回調(diào)屬性


onWorkerStart

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

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

$worker->onWorkerStart = function($worker){
     //代碼
};

$worker->onWorkerStart = 'test’;
function test($worker){
        echo 'hhhhh';
}

onConnect

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

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

$connection

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

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

onMessage

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

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

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

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

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

onClose

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

$worker->onClose = function($connection){
        echo 'connection close';
};

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

目前錯(cuò)誤類型有

1、調(diào)用Connection::send由于客戶端連接斷開導(dǎo)致的失?。ňo接著會(huì)觸發(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ā)送失敗(不會(huì)觸發(fā)onClose回調(diào))(code:WORKERMAN_SEND_FAIL msg:send buffer full and drop package)

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

onWorkerReload

此特性不常用到。

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

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

onBufferFull

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

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

onBufferDrain

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

Worker類接口方法

runAll

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

Worker::runAll()執(zhí)行后將永久阻塞,也就是說位于Worker::runAll()后面的代碼將不會(huì)被執(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();     //檢測(cè)命令行模式
    static::init();                      //初始化日志 pid  workid…
    static::lock();                     //啟動(dòng)文件 加鎖 獨(dú)占鎖
    static::parseCommand();  //解析命令  start   stop  restart  …
    static::daemonize();          //守護(hù)進(jìn)程運(yùn)行
    static::initWorkers();          //初始化 所有worker 實(shí)例
    static::installSignal();         //安裝信號(hào)
    static::saveMasterPid();    //保存主進(jìn)程id
    static::unlock();                  //解鎖
    static::displayUI();              //展示UI
    static::forkWorkers();          //fork 進(jìn)程
    static::resetStd();                //重置輸入輸出
    static::monitorWorkers();    //主進(jìn)程監(jiān)控各個(gè)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信號(hào)及其鍵值

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

感謝各位的閱讀!關(guān)于“workerman中worker類怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI