《就是要你懂swoole》-Server(一)

《就是要你懂swoole》-Server(一)

來自專欄就是要你懂swoole5 人贊了文章

小夥伴們,大家好,這篇博客給大家帶來的是有關swoole server的__construct的相關知識。對應的官方文檔在這裡。

構造函數的原型如下:

swoole_server(string $host, int $port = 0, int $mode = SWOOLE_PROCESS, int $sock_type = SWOOLE_SOCK_TCP);

我們一個一個的過一下構造函數裡面的參數。

host

$host,翻譯過來就是主機的意思。什麼是主機呢?

主機是指計算機除去輸入輸出設備以外的主要機體部分。也是用於放置主板及其他主要部件的控制箱體(容器Mainframe)。通常包括 CPU、內存、硬碟、光碟機、電源、以及其他輸入輸出控制器和介面。

這是百度百科的解釋。但是,在這個系列的文章裡面,為了描述簡單,我們直接把我們的計算機叫做主機。(我個人覺得計算機這個名詞是包含了輸入輸出設備的,例如滑鼠、鍵盤、顯示器等等)

port

$port,翻譯過來就是埠的意思。什麼是埠呢?

在這裡,我們所說的埠不是指硬體領域的埠。也就是說不是指USB埠、串列埠等(即不是指IO介面裡面的數據寄存器等等東西)。而指的是軟體領域的埠。也就是說指的是網路中面向連接服務和無連接服務(後面會說什麼是面向連接服務和無連接服務)的通信協議埠是一種抽象的軟體結構,包括一些數據結構和I/O(基本輸入輸出)緩衝區。

如果還是有一些抽象,不要緊,我們去看看Linux中埠這個數據結構的定義是怎樣的。數據結構的定義在這裡,大概是在80行的位置:

這個數據結構裡面,就有我們現在正在說的port:

struct inet_bind_bucket { /* other member */ unsigned short port; /* 埠號 */ signed char fastreuse; /* 埠是否允許被重用 */ /* other member */};

所以說,當我們給swoole_server這個構造函數傳遞一個埠號的時候,實際上就會在這個數據結構中的port成員變數中記錄下這個埠號。

OK,說到這裡,小夥伴們應該就更加理解什麼是埠了吧。它也和進程一樣,是一種數據結構

mode

$mode,翻譯過來就是模式的意思。在這裡指的是伺服器運行的模式:

  • SWOOLE_PROCESS多進程模式(默認)
  • SWOOLE_BASE基本模式

模式這一塊我們現在先放一下,到時候我會專門開一篇文章來講。

sock_type

$sock_type,翻譯過來就是套接字類型的意思。

swoole支持TCPUDPTCP6UDP6UnixSocket Stream/Dgram 6種。在這裡,我們重點看一下TCP和UDP。

首先,我們得知道套接字(socket)是什麼?

它是網路通信過程中端點的抽象表示,包含進行網路通信必需的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議埠,遠地主機的IP地址,遠地進程的協議埠。

這是百度百科的解釋。直接看的話,如果之前沒有網路編程的基礎,理解起來還是有一定的難度的,所以我們來做一個簡單的解釋。

網路通信過程中端點的抽象

首先,我們要理解網路通信的本質。實際上網路通信的本質是進程之間進行通信(要說更加本質的,可以扯到通信鏈路等等東西,但是在這裡我們只討論軟體)。為什麼這麼說?因為你會發現,客戶端和伺服器本質上是兩個跑起來的程序(即進程),然後客戶端和伺服器之間進行數據的交流,即所謂的通信。所以,本質上是兩個進程之間的通信。

其次,我們要理解這裡所說的端點是什麼意思。小夥伴們可能會說,這個問題簡單嘛,不就是之前所說的主機嘛,不就是通信雙方的主機嘛。其實,這麼說是不準確的。我們上面說了,網路通信的本質是進程之間的通信,因此,這裡所說的端點實際上指的是通信雙方的主機上面的進程

然後,我們再來看一看這句話裡面所說的抽象指的是什麼呢?就是後面那句話:

網路通信必需的五種信息

也就是說,套接字把這五種信息給結合起來了,只要你把套接字所需要的這五種信息描述清楚了,那麼,你就可以通過這個套接字,去和其他進程進行通信。

OK,我們講完了套接字之後,現在可以講一講描述套接字所需要的信息之一 -- 連接使用的協議(這裡所說的是傳輸層的協議,而不是應用層的協議)。而協議,就是這裡所說的sock_type了。那麼,TCP是什麼、UDP又是什麼呢?

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議,由IETF的RFC 793定義。

這是百度百科的解釋。所以,簡單的來說,TCP實際上是一種協議,由專門的網路專家經過研究而得出的一種規範(例如源埠所佔的位數、目的埠所佔的位數等等規範)。然後,操作系統的研發人員就按照專家們制定的規範,開發出了和TCP協議有關的數據結構,以及對這些數據結構的相關操作(通過這些操作,實現了TCP協議面向連接、可靠、基於位元組流的特點)。所以說,TCP直接的連接,更多的指的是軟體層面上的連接,即通過一些變數來表示是否建立連接,以及和誰進行了連接。至於什麼是面向連接的、可靠的、基於位元組流,我這裡就不說了,因為這個可以單獨寫成一篇文章了,為了控制這篇博客的長度,小夥伴們可以直接在網上搜一下TCP的特點就好了。

UDP也是類似的道理,這裡就不多說了。

最後,如果小夥伴們想要更加清晰的理解套接字,建議用C語言寫一寫網路編程的小demo。因為概念這東西,你不動手去寫,要理解起來還是有一定難度的,不是說腦瓜子笨,而是說,如果你寫過,那麼你的眼睛就看過,你理解的就更深刻。

(未完,明天接著寫)


推薦閱讀:

Swoole之初體驗

TAG:PHP | Swoole | PHP學習 |