目錄
1. reuseport 的作用
2. Workerman 如何利用 reuseport
首頁 php框架 Workerman Workerman中你不得不知道的屬性reusePort

Workerman中你不得不知道的屬性reusePort

Jul 23, 2021 pm 04:01 PM
workerman

Workerman是純PHP開發的開源高效能的非同步PHP socket框架。支援TCP長連接,支援websocket、MQTT等諸多協定。今天我們來介紹Workerman中的reusePort屬性,有需要的可以參考參考。

Workerman中你不得不知道的屬性reusePort

Workerman是高效能的PHP Socket伺服器框架。可以用Workerman 直接在TCP 層編程,基本的編程套路是:

$w = new Workerman\Worker('tcp://0.0.0.0:80');
$w->count = 4;
$w->onMessage = function(Workerman\COnnection\TcpConnection $connection, array $data) {
    $connection->send('Hello World');
};
Worker::runAll();
登入後複製

在使用的過程中,不知道你是否留意過reusePort 這個參數,他默認被設置為false。這個參數有什麼用?什麼情況下我們需要把他設定為 true,從而提高效能呢?

1. reuseport 的作用

關於reusePort 參數,Workerman官方的文檔是這麼解釋的:

開啟監聽端口復用後允許多個無親緣關係的進程監聽相同的端口,並且由系統核心做負載平衡,決定將socket連接交給哪個進程處理,避免了驚群效應,可以提升多進程短連接應用的性能。

如果沒有深入研究 Linux 網路編程,很難理解這句話。在此簡單解釋一下:

服務端程式通常會透過監聽伺服器上的某個連接埠號,來接收客戶端的請求。在Linux中,伺服器網路卡 連接埠號碼被抽象化了一個 Socket

為了提升效能,一般的服務端程式在執行時都有多個行程(俗稱Worker)監聽同一個Socket,在沒有客戶端連線到來的時候,這些Worker是處於掛起狀態的,不消耗CPU資源。

如果某一刻有一個客戶端連接到來,Linux 核心就會同時喚醒這些Worker,讓他們競爭去處理這個連接,

結果只有一個Worker 可以獲得處理這個連接的機會,其他Worker在競爭失敗後繼續回到掛起狀態。喚醒 Worker 的過程是消耗CPU資源的,Worker 數量越多,消耗的 CPU 資源就越多,造成了資源的浪費。這就是常說的 驚群效應

你也許會問:為什麼不每次只喚醒一個Worker呢?很遺憾,Linux核心並沒有這樣的功能。

幸好,在 Linux 3.9 及以後的版本,加入 reuseport 特性。這個特性有什麼用呢?

在有 reuseport 之前,一個連接埠號碼只能被一個 Socket 監聽,有了 reuseport 之後,這個限制就被打破了:一個連接埠號碼可以被多個 Socket 同時監聽。

前面說到,Linux 核心無法做到一次只喚醒一個 Worker,但是,核心可以做到將客戶端連線均勻地傳送到監聽統一連接埠的一群 Socket 上。

如圖所示,每個 Worker 都有自己的 Socket,都監聽同一個連接埠。當有客戶端連線到來時,核心轉送連線到一個 Socket 上,而這個 Socket 只會喚醒自己隸屬的那個 Worker。這樣就很巧妙地解決了 驚群效應,提高了整體的性能。

由此,我們可以得出結論:如果你的 Linux 核心版本是 3.9 及以上的話,那麼在使用 Workerman 時,可以將 reusePort 設定為 true 提升程式運作效率。

2. Workerman 如何利用 reuseport

雖然你只要在 Workerman 中把 reusePort 設定為 true,就能享受到 Linux 的這個進階特性。但 Workerman 的原始碼中,並不是開啟一個核心參數那麼簡單。 Workerman 為你隱藏了許多的設計細節,我們來研究下。

Worker 類別是Workerman 裡最主要的類,其中有一個listen() 函數:

protected function listen()
{
    ...
    if (!$this->_mainSocket) {
        ...
        $this->_mainSocket = stream_socket_server(...);
        ...
    }
    ...
}
登入後複製

#listen() 函數的作用就是在目前處理程序建立一個Socket 並開始監聽請求。

當reusePort 為false 時,主程序在創建Worker 之前就呼叫了listen() 函數:

protected function initWorkers() {
    ....
    if (!$worker->reusePort) {
        $worker->listen();
    }
    ....
}
登入後複製

隨後主程序通過pcntl_fork () 創建Worker。 pcntl_fork() 有個特性:建立出來的子行程(Worker)中的變數都是父行程複製而來的,包括父行程所建立的 mainSocket。所以,當reusePort為∗∗false∗∗時,所有的Worker都會複製父行程的mainSocket。所以,當reusePort為∗∗false∗∗時,所有的Worker都會複製父行程的_mainSocket,也也就是共用一個 Socket。

而當 reusePort 為 true 時,情況就不同了。主程序在建立Worker 前不會呼叫listen(),而是在建立完Worker 後由每個Worker 自行發起listen() 呼叫:

protected static function forkOneWorkerForLinux($worker) {
    ...
    $pid = pcntl_fork();
    if ($pid === 0) {
        if ($worker->reusePort) {
            $worker->listen();
        }
        ...
    }
    ...
}
登入後複製

這樣的結果就是,每個子進程(Worker)都創建了自己的Socket。

最後還有一點,如果想要核心開啟 reuseport 功能,需要手動設定 Socket 的 context:

if ($this->reusePort) {
    $context = stream_context_create();
    stream_context_set_option($context, 'socket', 'so_reuseport', 1);
}
登入後複製

推荐学习:php视频教程

以上是Workerman中你不得不知道的屬性reusePort的詳細內容。更多資訊請關注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)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
實作Workerman文件中的文件上傳與下載 實作Workerman文件中的文件上傳與下載 Nov 08, 2023 pm 06:02 PM

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

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

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

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

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

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 08, 2023 pm 03:46 PM

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

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

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

如何實現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伺服器十分簡單,只需寫如下程式碼:<?ph

See all articles