国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 淺談swoole的作用與原理

淺談swoole的作用與原理

2021-11-17 15:53八重櫻 PHP教程

異步Node系統可以在不同協議間共享代碼庫,并在代碼之外提供服務。實際上PHP中也有類似于Node的存在,并被列入了PHP拓展,叫做Swoole。本文將帶領讀者介紹其原理和如何使用。

PHP 中的 Node ?Swoole 到底是什么?

我先從官方文檔中引用下 Swoole 的定義:

Swoole:面向生產環境的 PHP 異步網絡通信引擎。
使 PHP 開發人員可以編寫高性能、可拓展的異步并發 TCP、UDP、Unix Socket、HTTP,WebSocket 服務,而無需深入了解非阻塞 I/O 編程和初級 Linux 內核。

Swoole 使用 C 語言編寫,作為 PHP 的基本擴展存在。聽起來可還行,是吧?用 PHP 來運行 HTTP 服務?用 PHP 實現 Websockets ?還有其他的可能性,是不是很風騷?而且所有的這些都會保持極高的性能,我們來看看吧!

如何讓它運行?

不同平臺的安裝方法有差異。

對于 Linux 來說,只需要運行一條 PECL 命令:

pecl install swoole

MacOS 用戶可以使用 brew 命令:

brew install swoole
brew install homebrew/php/php72-swoole

譯者注:截止翻譯時,Brew 官方已經移除了所有 PHP 擴展,請使用 PECL 安裝。

暫時不支持在 Windows 上的安裝,但是可以使用 Docker 的方式。

使用 Docker 運行 Swoole

毫無疑問,運行 PHP + Swoole 的最佳方案便是 Docker。讓我們來看看如何創建一個包含 Swoole 的容器。首先,我們需要創建一個 Dockerfile。

FROM php:latest\
RUN pecl install swoole\
ADD php.ini /usr/local/etc/php\
RUN usermod -u 1000 www-data

這看起來十分直接?;?PHP 官方 Docker 鏡像,使用 PECL 安裝 Swoole,接著復制 php.ini 到鏡像內 —— 搞定。最后一行是 MacOS 的 Docker 一個常規的權限修復命令。

至于被復制的 php.ini 配置文件,它只需一行:

extension=swoole.so

Swoole 可以做什么?

Swoole 有許多功能,大部分是異步執行。以下是其中最讓人感興趣的部分(其他的可以在 Swoole官方文檔中找到):

  • TCP/UDP 服務端與客戶端,
  • HTTP 服務端與客戶端,
  • Websocket 服務端與客戶端,
  • 基于 Redis 協議的服務端與客戶端,
  • MySQL 客戶端,
  • 原子性,
  • 文件系統。

我們來看下其中的 HTTP 服務、Websocket 服務、文件系統怎么使用。在我看來這是最重要的幾個功能。

基于 Swoole 實現 HTTP 服務

基于 Swoole 僅需少量代碼即可實現一個簡易的異步 HTTP 服務。以下是一份示例代碼,該例子使用異步文件系統來讀取index.html文件并作為響應返回給它處理的每條請求。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
chdir(__DIR__);
$http = new swoole_http_server('php', 8080);
$http->on('start', function ($server) {
    echo "Server has been started!\n";
});
$http->on('request', function ($request, $response) {
    swoole_async_readfile('index.html', function($filename, $content) use ($response) {
        $response->header('Content-Type', 'text/html');
        $response->end($content);
    });
});
$http->start();

如你所見,這段代碼看起來有點像 Node.js 的風格。

首先,我們創建一個類似 HTTP 服務的swoole_http_server對象。接著,綁定兩個異步回調函數到以下事件:一個用于啟動,將會在服務啟動時被調用;另一個用于請求,將會在收到每次請求時被調用,它帶有$request和$response兩個參數。

$request對象包含了所有與請求相關的數據:請求路徑(Path)、頭信息(Headers)等等。而$response被用來提供輸出、設置響應頭等。值得一提的是,以上兩個對象都不符合 PSR 標準,而是 Swoole 自定義的。
在請求事件中,異步請求文件系統用于從文件加載數據。 一旦數據可用,就會在數據加載完成后觸發回調。然后將此數據加載到響應體并關閉比此次響應。 這將會把數據有效地發送回瀏覽器。

這樣看起來很簡潔,最重要的是 --- 能運行起來。 來看下它的性能如何呢?

HTTP Server 標準

為了使用 Swoole 測試 HTTP 服務器的性能,我在 Node 中創建了一個應用程序 --- 它可以與 Swoole 中的應用程序完全相同 - 還有一個 服務器,它將提供 index.html 作為靜態文件。 全部運行在 3 個獨立的容器中。

然后,我用 wrk 工具給這些容器進行壓力測試。 結果令人震驚。

淺談swoole的作用與原理

Swoole 的工作性能要比預期的好很多!

這令人驚訝。 我沒想到 Swoole 會超越 Nginx ,但它確實做到了!這也遠遠超過了 Node 。 這個擴展的原始功能確實令人印象深刻,但它在請求中完成了更多工作后逐漸消失。 不幸的是, Swoole 有兩個小缺點,使這些缺點和原始標準有些偏差。 我們稍后會找到他們。

在 Websocket 服務中使用 Swoole

如前所述, Swoole 提供了一種創建 websocket 服務器的方法。 它以異步方式來進行工作,遵循與 HTTP 協議并和 Swoole 部分方法功能相同。 在我看來,它是最重要的 Swoole 組件之一。 來吧,在 PHP 運行中的 websockets 會是怎么樣。讓我們看看它的結果。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$server = new swoole_websocket_server('php', 9501);
$server->on('start', function (swoole_websocket_server $server) {
    echo "Server has been started!\n";
});
$server->on('open', function (swoole_websocket_server $server, $request) {
    echo "websocket: new connection, id: {$request->fd}\n";
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
    echo "websocket: {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    $server->push($frame->fd, "Replying, you sent " . $frame->data);
});
$server->on('close', function (swoole_websocket_server $server, $fd) {
    echo "websocket: connection with id {$fd} has been closed\n";
});
$server->start();

看起來類似于 HTTP 服務器的示例。

首先,我們創建類似于 websocket 服務器的 swoole_websocket_server 對象。 然后,我們將 4 個匿名函數綁定到 4 個事件。 第一個啟動事件,它將像 HTTP 服務器的啟動事件一樣工作。 第二個運行事件,它會在連接另一個 websocket 后執行。 第三個消息事件將在 websocket 向服務器發送消息時執行。最后 --- 關閉時間會在 websocket 斷開連接時執行。

ID 是作為 Websocket 連接到服務器的唯一標識,該 ID 隨每個新的 websockets 進行遞增。

使用 Swoole 時遇到的問題

到目前為止,這一切都運行良好,但在使用 Swoole 測試某些解決方案時遇到了兩個問題。 我將它列出來:

  • HTTP 服務器中沒有真正的支持 HTTPS,
  • 腳本中不支持全局變量。

第一問題個很容易解決。 我們只需要使用 Nginx 或任何負載均衡設備設置反向代理,就完成了。 但通過這樣做,我們就失去了 Swoole 提供的極端性能。

第二個問題更棘手。 Swoole 生成用于處理 HTTP 請求的工作進程,這意味著如果我們創建一個全局變量,它的值在線程之間是獨立的,并且它不能工作。下面這段代碼是顯示問題所在之處。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$server = new swoole_websocket_server('php', 9501);
$server->on('start', function (swoole_websocket_server $server) {
    echo "Server has been started!\n";
});
$server->on('open', function (swoole_websocket_server $server, $request) {
    echo "websocket: new connection, id: {$request->fd}\n";
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
    echo "websocket: {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    $server->push($frame->fd, "Replying, you sent " . $frame->data);
});
$server->on('close', function (swoole_websocket_server $server, $fd) {
    echo "websocket: connection with id {$fd} has been closed\n";
});
$server->start();

預期中響應的信息將返回 0 ,然后返回 1, 2 , 3 等等,但它總是返回 0 。

我找到了 Swoole 的作者來檢查它是否是一個 bug ,但事實并非如此。 為了獲得我們期望的行為,我們可以在配置中設置 worker_num = 1 ,但這會降低部分性能。

結論

總的來說,Swoole 有明亮的側面也有黑暗的角落。我認為將異步編程引入 PHP 仍然是一個好主意。 它可用于各種情況,包括快速設計原型,簡潔且責任單一的微服務,低延遲游戲服務器以及作為大型框架的后端服務器。 確實有前途。

以上就是淺談swoole的作用與原理的詳細內容,更多關于swoole的作用與原理的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/a609251438/p/12013539.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 精品国产一区二区三区日日嗨 | 欧美日韩国产一区二区三区 | 91av影院 | 美国成人在线 | 不卡久久| 国产成人精品一区二区三区四区 | 久久久精品久久久 | 在线午夜 | 韩国成人精品a∨在线观看 欧美精品综合 | 一级在线 | 激情久久婷婷 | 国产日韩一区二区三区 | 国产综合久久 | 欧美日韩一区二区三区在线观看 | 久久久99国产精品免费 | 亚洲在线播放 | 午夜精品久久久久久久久久久久 | av一区二区在线观看 | 精品日韩在线 | 亚洲精品久久久久久久久久久久久 | 最新天堂中文在线 | 亚洲日本va在线观看 | 美女久久| www.xxx在线观看 | 国产高清自拍视频 | 天天干天天操 | 中文字幕国产 | 国产在线精品一区 | 国产在线国产 | 成人精品视频免费 | 国产婷婷精品 | 久久久久久久久99精品 | 国产91短视频 | 亚洲一区二区三区免费 | 国产成人综合网 | 久久久久久久久一区二区三区 | 国产黄色在线网站 | 欧美激情五月 | 情一色一乱一欲一区二区 | 日韩精品一区二区三区在线播放 | 欧美成人a |