目錄
什麼是workerman?
workerman的特性
workerman應用程式場景
workerman安裝
環境需求:
##安裝libevent
#workerman目錄結構
實作簡單的http伺服器
實作websocket
workerman原理
Worker類別
Worker類別屬性
Worker类回调属性

onWorkerStart
Worker类接口方法

Worker类代码流程分析
Linux 常用SIG信号及其键值
首頁 php框架 Workerman 淺談workerman中worker類的用法

淺談workerman中worker類的用法

Feb 03, 2021 am 11:01 AM
workerman

這篇文章跟大家介紹一下workerman,以及談談workerman中worker類別的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

淺談workerman中worker類的用法

相關推薦:《workerman教學

什麼是workerman?

Workerman是一款開源高效能非同步PHP socket 即時通訊框架。支援高並發,超高穩定性,被廣泛的用於手機app、行動通訊,微信小程序,手遊服務端、網路遊戲、PHP聊天室、硬體通訊、智慧家庭、車聯網、物聯網等領域的開發。支援TCP長連接,支援Websocket、HTTP等協議,支援自訂協議。擁有非同步Mysql、非同步Redis、非同步Http、MQTT物聯網用戶端、非同步訊息佇列等眾多高效能元件。

官網:https://www.workerman.net/

workerman的特性

純PHP開發   
支援PHP多重流程
支援TCP、UDP
支援長連線
支援各種應用層協定
支援高並發
支援服務平滑重啟
支援HHVM
支援以指定使用者執行子程序
自帶監控
支援毫秒級定時器
支援非同步IO
支援物件或資源永久保持
高效能
支援分散式部署
支援心跳偵測

workerman應用程式場景

workerman安裝

環境需求:

#workerman從3.5.3版本開始已經能夠同時支援linux系統和windows系統。

需要PHP>=5.3.3,並且配置好PHP的環境變數。

注意  本教學使用linux  不會講windows  實際使用也不建議用windows系統

Linux    lnmp一鍵安裝腳本

1、安裝PHP>=5.3.3 ,並安裝了pcntl、posix擴充   --enable-pcntl  --enable-posix
2、建議安裝event或libevent擴展,但不是必須的(注意event擴充需要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

注意目前libevent擴充功能不支援php7,php7用戶只能使用Event擴充。

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目錄結構


workerman簡單開發demo

實作簡單的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  即可
登入後複製

實作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(&#39;lampol&#39;);
        }

        ws.onmessage = function(e){
                console.log(e.data)
        }

</script>
</body>
</html>
登入後複製

workerman原理

Worker類別

WorkerMan中有兩個重要的類別Worker與Connection。
Worker類別用於實現連接埠的監聽,並可設定客戶端連線事件、連線上訊息事件、連線中斷事件的回呼函數,進而實現業務處理。

$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內建的文字協議,相容telnet,詳情請參閱附錄Text協議部分)

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

Worker類別屬性

##count

設定目前Worker實例啟動多少個進程,不設定時預設為1。

此屬性必須在Worker::runAll();運行前設定才有效。 windows系統不支援此特性。

進程數設定依據:

1、cpu核數

2、記憶體大小

3、業務偏向IO密集或CPU密集型

不清楚自己業務偏向哪種類型,可設定進程數為CPU核數的2倍左右即可。

lscpu    top   1  查看cpu核數

id

当前worker进程的id编号,范围为0到$worker->count-1。进程重启后id编号值是不变的。

name

设置当前Worker实例的名称,方便运行status命令时识别进程。不设置时默认为none。

protocol
设置当前Worker实例的协议类。

transport
设置当前Worker实例所使用的传输层协议,目前只支持3种(tcp、udp、ssl)。不设置默认为tcp。

daemonize
此属性为全局静态属性,表示是否以daemon(守护进程)方式运行。如果启动命令使用了 -d参数,则该属性会自动设置为true。也可以代码中手动设置。

logFile

用来指定workerman日志文件位置。此文件记录了workerman自身相关的日志,包括启动、停止等。
Worker::$logFile = '/tmp/workerman.log’;

stdoutFile

此属性为全局静态属性,如果以守护进程方式(-d启动)运行,则所有向终端的输出(echo var_dump等)都会被重定向到stdoutFile指定的文件中。
Worker::$stdoutFile = 'test.log’;

pidFile
如果无特殊需要,建议不要设置此属性
Worker::$pidFile = '/var/run/workerman.pid’;

user
设置当前Worker实例以哪个用户运行。此属性只有当前用户为root时才能生效。不设置时默认以当前用户运行。
建议$user设置权限较低的用户,例如www-data、apache、nobody等。

connections

array(id=>connection, id=>connection, ...)
此属性中存储了当前进程的所有的客户端连接对象,其中id为connection的id编号

reloadable
设置当前Worker实例是否可以reload,即收到reload信号后是否退出重启。不设置默认为true,收到reload信号后自动重启进程。

reusePort

设置当前worker是否开启监听端口复用(socket的SO_REUSEPORT选项),默认为false,不开启。

globalEvent
此属性为全局静态属性,为全局的eventloop实例,可以向其注册文件描述符的读写事件或者信号事件。

Worker类回调属性


onWorkerStart

设置Worker子进程启动时的回调函数,每个子进程启动时都会执行。

回掉函数参数 $worker Worker 对象

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

$worker->onWorkerStart = &#39;test’;
function test($worker){
        echo &#39;hhhhh&#39;;
}
登入後複製

onConnect

当客户端与Workerman建立连接时(TCP三次握手完成后)触发的回调函数。每个连接只会触发一次onConnect回调。

回调函数的参数

$connection
登入後複製

连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等

$worker->onConnect = function($connection){
        echo &#39;new connect....&#39;.$connection->getRemoteIp();
};
登入後複製

onMessage

当客户端通过连接发来数据时(Workerman收到数据时)触发的回调函数

回调函数的参数

$connection
连接对象,即TcpConnection实例,用于操作客户端连接,如发送数据,关闭连接等

$data
客户端连接上发来的数据,如果Worker指定了协议,则$data是对应协议decode(解码)了的数据

$worker->onMessage = function($connection,$data){
        echo $data;
        $connection->send(&#39;hello &#39;.$data.PHP_EOL);
};
登入後複製

onClose

当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose。每个连接只会触发一次onClose。由于断网或者断电等极端情况断开的连接 ,也就无法及时触发onClose,这种情况需要通过应用层心跳来解决

$worker->onClose = function($connection){
        echo &#39;connection close&#39;;
};
登入後複製

onError
当客户端的连接上发生错误时触发。

目前错误类型有

1、调用Connection::send由于客户端连接断开导致的失败(紧接着会触发onClose回调) (code:WORKERMAN_SEND_FAIL msg:client closed)

2、在触发onBufferFull后(发送缓冲区已满),仍然调用Connection::send,并且发送缓冲区仍然是满的状态导致发送失败(不会触发onClose回调)(code:WORKERMAN_SEND_FAIL msg:send buffer full and drop package)

3、使用AsyncTcpConnection异步连接失败时(紧接着会触发onClose回调) (code:WORKERMAN_CONNECT_FAIL msg:stream_socket_client返回的错误消息)

onWorkerReload

此特性不常用到。

设置Worker收到reload信号后执行的回调。

可以利用onWorkerReload回调做很多事情,例如在不需要重启进程的情况下重新加载业务配置文件。

onBufferFull

每个连接都有一个单独的应用层发送缓冲区,如果客户端接收速度小于服务端发送速度,数据会在应用层缓冲区暂存,如果缓冲区满则会触发onBufferFull回调。

缓冲区大为TcpConnection::$maxSendBufferSize,默认值为1MB,可以为当前连接动态设置缓冲区大小例

onBufferDrain

每个连接都有一个单独的应用层发送缓冲区,缓冲区大小由TcpConnection::$maxSendBufferSize决定,默认值为1MB,可以手动设置更改大小,更改后会对所有连接生效。

Worker类接口方法

runAll

运行所有Worker实例。

Worker::runAll()执行后将永久阻塞,也就是说位于Worker::runAll()后面的代码将不会被执行。所有Worker实例化应该都在Worker::runAll()前进行。

stopAll

停止当前进程(子进程)的所有Worker实例并退出。
此方法用于安全退出当前子进程,作用相当于调用exit/die退出当前子进程。

listen

用于实例化Worker后执行监听。


Worker类代码流程分析

public function __construct($socket_name = &#39;&#39;, $context_option = array())

public static function runAll()
{
    static::checkSapiEnv();     //检测命令行模式
    static::init();                      //初始化日志 pid  workid…
    static::lock();                     //启动文件 加锁 独占锁
    static::parseCommand();  //解析命令  start   stop  restart  …
    static::daemonize();          //守护进程运行
    static::initWorkers();          //初始化 所有worker 实例
    static::installSignal();         //安装信号
    static::saveMasterPid();    //保存主进程id
    static::unlock();                  //解锁
    static::displayUI();              //展示UI
    static::forkWorkers();          //fork 进程
    static::resetStd();                //重置输入输出
    static::monitorWorkers();    //主进程监控各个worker的状态
}
登入後複製

SAPI(Server Application Programming Interface)服务器应用程序编程接口,即PHP与其他应用交互的接口,PHP脚本要执行有很多方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。

常见的SAPI有:cgi、fast-cgi、cli、apache模块的DLL、isapi

Linux 常用SIG信号及其键值

01 SIGHUP 挂起(hangup)
02 SIGINT 中断,当用户从键盘按^c键或^break键时
03 SIGQUIT 退出,当用户从键盘按quit键时
04 SIGILL 非法指令
05 SIGTRAP 跟踪陷阱(trace trap),启动进程,跟踪代码的执行
06 SIGIOT IOT指令
07 SIGEMT EMT指令
08 SIGFPE 浮点运算溢出
09 SIGKILL 杀死、终止进程
10 SIGBUS 总线错误
11 SIGSEGV 段违例(segmentation  violation),进程试图去访问其虚地址空间以外的位置
12 SIGSYS 系统调用中参数错,如系统调用号非法
13 SIGPIPE 向某个非读管道中写入数据
14 SIGALRM 闹钟。当某进程希望在某时间后接收信号时发此信号
15 SIGTERM 软件终止(software  termination)
16 SIGUSR1 用户自定义信号1
17 SIGUSR2 用户自定义信号2
18 SIGCLD 某个子进程死

更多计算机编程相关知识,请访问:编程视频!!

以上是淺談workerman中worker類的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

實作Workerman文件中的文件上傳與下載 實作Workerman文件中的文件上傳與下載 Nov 08, 2023 pm 06:02 PM

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

如何實作Workerman文件的基本使用方法 如何實作Workerman文件的基本使用方法 Nov 08, 2023 am 11:46 AM

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

swoole和workerman哪個好 swoole和workerman哪個好 Apr 09, 2024 pm 07:00 PM

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

Workerman開發:如何實現基於UDP協定的即時視訊通話 Workerman開發:如何實現基於UDP協定的即時視訊通話 Nov 08, 2023 am 08:03 AM

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

如何實作Workerman文件中的定時器功能 如何實作Workerman文件中的定時器功能 Nov 08, 2023 pm 05:06 PM

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

如何使用Workerman建構高可用性負載平衡系統 如何使用Workerman建構高可用性負載平衡系統 Nov 07, 2023 pm 01:16 PM

如何使用Workerman建立高可用性負載平衡系統,需要具體程式碼範例在現代技術領域中,隨著網路的快速發展,越來越多的網站和應用程式需要處理大量的並發請求。為了實現高可用性和高效能,負載平衡系統成為了必不可少的組件之一。本文將介紹如何使用PHP開源框架Workerman建構一個高可用性的負載平衡系統,並提供具體的程式碼範例。一、Workerman簡介Worke

如何實現Workerman文件中的反向代理功能 如何實現Workerman文件中的反向代理功能 Nov 08, 2023 pm 03:46 PM

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

如何實現Workerman文件中的TCP/UDP通信 如何實現Workerman文件中的TCP/UDP通信 Nov 08, 2023 am 09:17 AM

如何實現Workerman文件中的TCP/UDP通信,需要具體程式碼範例Workerman是一款高效能的PHP非同步事件驅動框架,廣泛用於實現TCP和UDP通訊。本文將介紹如何使用Workerman實現基於TCP和UDP的通信,並提供相應的程式碼範例。一、TCP通訊創建TCP伺服器使用Workerman建立TCP伺服器十分簡單,只需寫如下程式碼:&lt;?ph

See all articles