workerman介紹worker類


yum install php-process即可安裝pcntl和posix擴展

https://www.workerman.net/doc

 

php stat.php start -d #這是在守護進程里面

 

需要了解的基本概念

 

1、TCP傳輸層協議

TCP是一種面向連接的、可靠的、基於IP傳輸層協議。TCP傳輸層協議一個重要特點是TCP是基於數據流的,客戶端的請求會源源不斷的發送給服務端,服務端收到的數據可能不是一個完整的請求,也有可能是多個請求連在一起。這就需要我們在這源源不斷的數據流中區分每個請求的邊界。而應用層協議主要是為請求邊界定義一套規則,避免請求數據混亂。

2、應用層協議

應用層協議(application layer protocol)定義了運行在不同端系統上(客戶端、服務端)的應用程序進程如何相互傳遞報文,例如HTTP、WebSocket都屬於應用層協議。例如一個簡單的應用層次協議可以如下{"module":"user","action":"getInfo","uid":456}\n"。此協議是以"\n"(注意這里"\n"代表的是回車)標記請求結束,消息體是字符串。

3、短連接

短連接是指通訊雙方有數據交互時,就建立一個連接,數據發送完成后,則斷開此連接,即每次連接只完成一項業務的發送。像WEB網站的HTTP服務一般都用短連接。

短連接應用程序開發可以參考基本開發流程一章

4、長連接

長連接,指在一個連接上可以連續發送多個數據包

注意:長連接應用必須加心跳,否則連接可能由於長時間不活躍而被路由節點防火牆斷開。

長連接多用於操作頻繁,點對點的通訊的情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多。所以長連接在每個操作完后都不斷開,下次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接,如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。

當需要主動向客戶端推送數據時,例如聊天類、即時游戲類、手機推送等應用需要長連接。 長連接應用程序開發可以參考Gateway/Worker開發流程

 

目錄結構

 

Workerman                      // workerman內核代碼
    ├── Connection                 // socket連接相關
    │   ├── ConnectionInterface.php// socket連接接口
    │   ├── TcpConnection.php      // Tcp連接類
    │   ├── AsyncTcpConnection.php // 異步Tcp連接類
    │   └── UdpConnection.php      // Udp連接類
    ├── Events                     // 網絡事件庫
    │   ├── EventInterface.php     // 網絡事件庫接口
    │   ├── Libevent.php           // Libevent網絡事件庫
    │   ├── Ev.php                 // Libev網絡事件庫
    │   └── Select.php             // Select網絡事件庫
    ├── Lib                        // 常用的類庫
    │   ├── Constants.php          // 常量定義
    │   └── Timer.php              // 定時器
    ├── Protocols                  // 協議相關
    │   ├── ProtocolInterface.php  // 協議接口類
    │   ├── Http                   // http協議相關
    │   │   └── mime.types         // mime類型
    │   ├── Http.php               // http協議實現
    │   ├── Text.php               // Text協議實現
    │   ├── Frame.php              // Frame協議實現
    │   └── Websocket.php          // websocket協議的實現
    ├── Worker.php                 // Worker
    ├── WebServer.php              // WebServer
    └── Autoloader.php             // 自動加載類

 

Worker類用於實現端口的監聽,並可以設置客戶端連接事件、連接上消息事件、連接斷開事件的回調函數,從而實現業務處理 

 

------------------------------------------------------------------------------------------------

require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;

// 運行在主進程 監聽地址
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// 賦值過程運行在主進程 向客戶端發送數據
$tcp_worker->onMessage = function($connection, $data)
{
  // 這部分運行在子進程 hello 返回給瀏覽器(發送給客戶端) 
  $connection->send('hello ' . $data);
};

Worker::runAll();


<html里面>

 <script>

ws = new WebSocket('ws://192.168.113.138:22222'); //這是連接websocket協議 

$worker->protocol = 'workerman\\Protocols\\websocket'; #換個websocket協議

#連接成功發數據,我發個東西 

ws.onopen=function() {
  ws.send('lampol')
}

#接受服務端發送過來的數據 就是$connection->send('hello websocket')
ws.onmessage= function(e){
  console.log(e.data)
}

</script>


----------------------------------------------------------------------------------------------------------------------

 

master 管理 worker進程 (處理數據會分下面的worker進程)

 

 

 

master worker模型說明:
master進程為主進程,啟動過程中讀取conf配置,根據每個應用配置中的ip和端口創建監聽socket,然后再根據配置中的進程數創建對應數量的子進程即worker進程,worker進程會自動繼承master進程創建的監聽socket,使得worker進程能夠獨立的接受並處理客戶端的連接。而后master進程進入監聽信號的邏輯中,監聽worker進程退出信號(worker進程退出后,系統會自動向master進程發送一個SIGHCLD信號,mater進程會重新創建子進程,將缺失的子進程補上),master進程還會監聽workermand腳本發來的停止信號(SIGINT)和平滑重啟服務信號(SIGHUP)

worker進程為master進程派生出來的子進程,自動繼承了master進程的監聽socket,每個worker進程獨立的接受並處理客戶端的連接。

master worker模型比較適合業務簡單的應用或者短連接應用

 

 

設置當前worker實例啟動該多少個進程,不設置時默認為1

進程數設置依據 

1、cpu核數

2、內存大小

3、業務偏向IO密集還是cpu密集型 

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

lscpu top -> 1 查看cpu核數 

  cpu 0 就是1個cpu 

 

use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

Worker::$daemonize = true;
// 所有的打印輸出全部保存在/tmp/stdout.log文件中
Worker::$stdoutFile = '/tmp/stdout.log';
$worker = new Worker('text://0.0.0.0:8484');
$worker->onWorkerStart = function($worker)
{
    echo "Worker start\n";
};
// 運行worker
Worker::runAll();

  

 

id   每個進程都有個id,當前worker進程的id編號,范圍為0$worker->count-1. 進程重啟后id編號值是不變的。

name 設置當前Worker實例的名稱,方便運行status命令時識別進程。不設置時默認為none。

protocol  設置當前Worker實例的協議類。 注:協議處理類可以直接在初始化Worker在監聽參數時直接指定$worker = new

  Worker('tcp://0.0.0.0:8686'); #定義一個tpc

  $worker->protocol = 'Workerman\\Protocols\\Http'; #又指定要給http協議,最后實現http協議,用http協議訪問 

transport  設置當前Worker實例所使用的傳輸層協議,目前只支持3種(tcp、udp、ssl)。不設置默認為tcp。

daemonize   此屬性為全局靜態屬性,表示是否以daemon(守護進程)方式運行。如果啟動命令使用了 -d參數(php index.php start -d),則該屬性會自動設置為true。也可以代碼中手動設置 (Worker::$daemonize = true;)

logFile  Worker::$logFile = '/tmp/workerman.log'; #啟動日志的位置

stdoutFile 此屬性為全局靜態屬性,如果以守護進程方式(-d啟動)運行,則所有向終端的輸出(echo var_dump等)都會被重定向到stdoutFile指定的文件中。默認是查下workerman_std.log 手動設置Worker::$stdoutFile = '/tmp/stdout.log';

pidFile 進程號  Worker::$pidFile = '/var/run/workerman.pid';

connections 存儲了當前進程的所有的客戶端連接對象,其中id為connection的id編號  

 Timer::add(10, function()use($worker) {
    
$worker->connections #這個是worker屬性  
 // 遍歷當前進程所有的客戶端連接,發送當前服務器的時間 #foreach($worker->connections as $connection) #{ #$connection->send(time()); #} });









回調屬性


  onWorkerStart  有4個子進程,就會有4個  設置Worker子進程啟動時的回調函數,每個子進程啟動時都會執行。

  

 

或者 

  

 

 輸出

 

 
        

onConnect

  當客戶端與Workerman建立連接時(TCP三次握手完成后)觸發的回調函數。每個連接只會觸發一次onConnect回調

$connection 

  連接對象,即TcpConnection實例,用於操作客戶端連接,如發送數據,關閉連接等 

  $worket->onConnect = function($connection) { 

    echo 'new connect ....'.$connection->getRemotelp().PHP_EOL;  #當客戶連接的時候獲得對方ip

  }

 
  
客戶端連接
  
 
        

onMessage

    當客戶端通過連接發來數據時(Workerman收到數據時)觸發的回調函數

    $connection

    連接對象,即TcpConnection實例,用於操作客戶端連接,如發送數據關閉連接

    $data   #服務端發送過來的數據

    客戶端連接上發來的數據,如果Worker指定了協議,則$data是對應協議decode(解碼)了的數據

 
        
$worker = new Worker('websocket://0.0.0.0:8484');
            #$connection連接的對象  #$data客戶端發來的數據 $worker->onMessage = function($connection, $data) { var_dump($data);
  //往客戶端發數據 $connection->send('receive success'); };
 

客戶端連接發送123

 

 

onClose

 當客戶端連接與Workerman斷開時觸發的回調函數。不管連接是如何斷開的,只要斷開就會觸發onClose。每個連接只會觸發一次onClose  

$worker->onClose = function($connection) { echo "connection closed\n"; };

onBufferFull

  每個連接都有一個單獨的應用層發送緩沖區,如果客戶端接收速度小於服務端發送速度,數據會在應用層緩沖區暫存,如果緩沖區滿則會觸發onBufferFull回調
  // 設置當前連接發送緩沖區,單位字節   $connection->maxSendBufferSize = 102400;

  也可以利用TcpConnection::$defaultMaxSendBufferSize 設置所有連接默認緩沖區的大小,例如代碼:

  use Workerman\Connection\TcpConnection;   // 設置所有連接的默認應用層發送緩沖區大小,單位字節   TcpConnection::$defaultMaxSendBufferSize = 2*1024*1024;






stopAll() 客戶端給我發數據大於5次,我就斷開

 

 

設置端口復用

 onWorkersStart 當有進程啟動 

// 每個進程啟動后在當前進程新增一個Worker監聽 $worker->onWorkerStart = function($worker) { $inner_worker = new Worker('http://0.0.0.0:2016'); // 設置端口復用,可以創建監聽相同端口的Worker(需要PHP>=7.0) $inner_worker->reusePort = true; $inner_worker->onMessage = 'on_message'; // 執行監聽。正常監聽不會報錯 在加上端口復用 $inner_worker->listen(); };



https://blog.csdn.net/fastjack/article/details/79523363   #其它資料 

http://doc.workerman.net/worker/on-buffer-full.html #其它資料 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM