您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關workerman中worker類怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Workerman是一款開源高性能異步PHP socket 即時通訊框架。支持高并發,超高穩定性,被廣泛的用于手機app、移動通訊,微信小程序,手游服務端、網絡游戲、PHP聊天室、硬件通訊、智能家居、車聯網、物聯網等領域的開發。 支持TCP長連接,支持Websocket、HTTP等協議,支持自定義協議。擁有異步Mysql、異步Redis、異步Http、MQTT物聯網客戶端、異步消息隊列等眾多高性能組件。
官網:https://www.workerman.net/
純PHP開發
支持PHP多進程
支持TCP、UDP
支持長連接
支持各種應用層協議
支持高并發
支持服務平滑重啟
支持HHVM
支持以指定用戶運行子進程
自帶監控
支持毫秒級別定時器
支持異步IO
支持對象或者資源永久保持
高性能
支持分布式部署
支持心跳檢測
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
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
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 即可
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與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的上下文選項
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子進程啟動時的回調函數,每個子進程啟動時都會執行。
回掉函數參數 $worker Worker 對象
$worker->onWorkerStart = function($worker){ //代碼 }; $worker->onWorkerStart = 'test’; function test($worker){ echo 'hhhhh'; }
onConnect
當客戶端與Workerman建立連接時(TCP三次握手完成后)觸發的回調函數。每個連接只會觸發一次onConnect回調。
回調函數的參數
$connection
連接對象,即TcpConnection實例,用于操作客戶端連接,如發送數據,關閉連接等
$worker->onConnect = function($connection){ echo 'new connect....'.$connection->getRemoteIp(); };
onMessage
當客戶端通過連接發來數據時(Workerman收到數據時)觸發的回調函數
回調函數的參數
$connection
連接對象,即TcpConnection實例,用于操作客戶端連接,如發送數據,關閉連接等
$data
客戶端連接上發來的數據,如果Worker指定了協議,則$data是對應協議decode(解碼)了的數據
$worker->onMessage = function($connection,$data){ echo $data; $connection->send('hello '.$data.PHP_EOL); };
onClose
當客戶端連接與Workerman斷開時觸發的回調函數。不管連接是如何斷開的,只要斷開就會觸發onClose。每個連接只會觸發一次onClose。由于斷網或者斷電等極端情況斷開的連接 ,也就無法及時觸發onClose,這種情況需要通過應用層心跳來解決
$worker->onClose = function($connection){ echo 'connection close'; };
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,可以手動設置更改大小,更改后會對所有連接生效。
runAll
運行所有Worker實例。
Worker::runAll()執行后將永久阻塞,也就是說位于Worker::runAll()后面的代碼將不會被執行。所有Worker實例化應該都在Worker::runAll()前進行。
stopAll
停止當前進程(子進程)的所有Worker實例并退出。
此方法用于安全退出當前子進程,作用相當于調用exit/die退出當前子進程。
listen
用于實例化Worker后執行監聽。
public function __construct($socket_name = '', $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
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類怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。