yum install php-process即可安裝pcntl和posix擴展
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 #其它資料
