Swoole v4.8.0 版本釋出,增加 Swoole Dashboard 皮膚

沈唁 發表於 2021-10-14
Swoole

距離上個版本v4.7.1釋出近兩個月了,v4.8.0 版本終於釋出了。

此版本包含了新功能、BUG 修復以及向下不相容的改動。

不相容改動

在 base 模式下,onStart 回撥將始終在第一個工作程式 (worker id 為 0) 啟動時回撥,先於 onWorkerStart 執行。在 onStart 函式中始終可以使用協程 API,Worker-0 出現致命錯誤重啟時,會再次回撥 onStart

在之前的版本中,onStart 在只有一個工作程式時,會在 Worker-0 中回撥。有多個工作程式時,在 Manager 程式中執行。

admin_server

在此版本中重要的功能就是增加了admin_server的選項,用於提供 API 服務,可以用於在 Swoole Dashboard 皮膚中檢視當前服務的資訊,例如 PHP 載入的擴充套件、檔案、類、函式、常量,以及 Swoole 相關的程式、協程、連線資訊等。

//建立Server物件,監聽 127.0.0.1:9501 埠
$server = new Swoole\Server('127.0.0.1', 9501);

$server->set([
    'admin_server' => '0.0.0.0:9502', // 啟用 admin_server 服務
    'worker_num' => 2,
    'task_worker_num' => 3
]);

//監聽連線進入事件
$server->on('Connect', function ($server, $fd) {
    echo "Client: Connect.\n";
});

//監聽資料接收事件
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "Server: {$data}");
});

//監聽連線關閉事件
$server->on('Close', function ($server, $fd) {
    echo "Client: Close.\n";
});

//啟動伺服器
$server->start();

可以在更新 Swoole v4.8.0 版本後,前往 https://dashboard.swoole.com/ 進行體驗。

在登入時配置本地的admin_server地址或者雲端的地址,形如:http://127.0.0.1:9502/ ,登入後也可以在右上角配置其他地址。

注:少數功能受限,需要安裝ext-swoole_plus

另外還增加了一些新的 API:Table::statsCoroutine::join等,下面來具體看一下:

Coroutine::join

併發執行多個協程。

Swoole\Coroutine::join(array $cid_array, float $timeout = -1): bool

$timeout為總的超時時間,超時後會立即返回。但正在執行的協程會繼續執行完畢,而不會中止

use Swoole\Coroutine;
use function Swoole\Coroutine\go;
use function Swoole\Coroutine\run;

run(function () {
    $status = Coroutine::join([
        go(function () use (&$result) {
            $result['baidu'] = strlen(file_get_contents('https://www.baidu.com/'));
        }),
        go(function () use (&$result) {
            $result['zhihu'] = strlen(file_get_contents('https://www.zhihu.com/'));
        })
    ], 1);
    var_dump($result, $status);
});

addCommand/command

Swoole Dashboard 的 API 就是基於addCommand提供的,程式碼位於 library 中,除了 library 中提供的command,swoole 擴充套件中也有一些。

當然也可以自定義:

Swoole\Server->addCommand(string $name, int $accepted_process_types, callable $callback)

$server->addCommand('test_getpid', SWOOLE_SERVER_COMMAND_MASTER | SWOOLE_SERVER_COMMAND_EVENT_WORKER,
    function ($server) {
        return json_encode(['pid' => posix_getpid()]);
});

command方法用於在 server 中呼叫定義的介面:

Swoole\Server->command(string $name, int $process_id, int $process_type, $data, bool $json_decode = true)

$server->command('test_getpid', 0, SWOOLE_SERVER_COMMAND_MASTER, ['type' => 'master']);

onBeforeShutdown

新增onBeforeShutdown事件回撥,在此回撥中可以使用協程 API。

  • 安全提示

onStart回撥中可以使用非同步和協程的 API,但需要注意這可能會與dispatch_funcpackage_length_func存在衝突,請勿同時使用

Coroutine::getStackUsage()

獲取當前 PHP 棧的記憶體使用量。

Swoole\Coroutine::getStackUsage([$cid]): int

Table::stats

用來獲取 Swoole\Table 狀態。

use Swoole\Table;

$table = new Table(1024);
$table->column('string', Table::TYPE_STRING, 256);
$table->create();

$table->set('swoole', ['string' => 'www.swoole.com']);
var_dump($table->stats());

//array(8) {
//  ["num"]=>
//  int(1)
//  ["conflict_count"]=>
//  int(0)
//  ["conflict_max_level"]=>
//  int(0)
//  ["insert_count"]=>
//  int(1)
//  ["update_count"]=>
//  int(0)
//  ["delete_count"]=>
//  int(0)
//  ["available_slice_num"]=>
//  int(204)
//  ["total_slice_num"]=>
//  int(204)
//}

更新日誌

下面是完整的更新日誌:

向下不相容改動

  • 在 base 模式下,onStart 回撥將始終在第一個工作程式 (worker id 為 0) 啟動時回撥,先於 onWorkerStart 執行 (#4389) (@matyhtf)

新增 API

  • 新增 Coroutine::getStackUsage() 方法 (#4398) (@matyhtf) (@twose)
  • 新增 Coroutine\Redis 的一些 API (#4390) (@chrysanthemum)
  • 新增 Table::stats() 方法 (#4405) (@matyhtf)
  • 新增 Coroutine::join() 方法 (#4406) (@matyhtf)

新增功能

  • 支援 server command (#4389) (@matyhtf)
  • 支援 Server::onBeforeShutdown 事件回撥 (#4415) (@matyhtf)

增強

  • 當 Websocket pack 失敗時設定錯誤碼 (swoole/[email protected]) (@matyhtf)
  • 新增 Timer::exec_count 欄位 (#4402) (@matyhtf)
  • hook mkdir 支援使用 open_basedir ini 配置 (#4407) (@NathanFreeman)
  • library 新增 vendor_init.php 指令碼 (swoole/[email protected]) (@matyhtf)
  • SWOOLE_HOOK_CURL 支援 CURLOPT_UNIX_SOCKET_PATH (swoole/library#121) (@sy-records)
  • Client 支援設定 ssl_ciphers 配置項 (#4432) (@amuluowin)
  • Server::stats() 新增了一些新的資訊 (#4410) (#4412) (@matyhtf)

修復

  • 修復檔案上傳時,對檔名字進行不必要的 URL decode (swoole/[email protected]) (@matyhtf)
  • 修復 HTTP2 max_frame_size 問題 (#4394) (@twose)
  • 修復 curl_multi_select bug #4393 (#4418) (@matyhtf)
  • 修復丟失的 coroutine options (#4425) (@sy-records)
  • 修復當傳送緩衝區滿的時候,連線無法被 close 的問題 (swoole/[email protected]) (@matyhtf)

Swoole v4.8.0 版本釋出,增加 Swoole Dashboard 皮膚