距離上個版本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::stats
、Coroutine::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_func
和package_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/swoole-src@d27c5a5) (@matyhtf)
- 新增
Timer::exec_count
欄位 (#4402) (@matyhtf) - hook mkdir 支援使用 open_basedir ini 配置 (#4407) (@NathanFreeman)
- library 新增 vendor_init.php 指令碼 (swoole/library@6c40b02) (@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/swoole-src@a73780e) (@matyhtf)
- 修復 HTTP2 max_frame_size 問題 (#4394) (@twose)
- 修復 curl_multi_select bug #4393 (#4418) (@matyhtf)
- 修復丟失的 coroutine options (#4425) (@sy-records)
- 修復當傳送緩衝區滿的時候,連線無法被 close 的問題 (swoole/swoole-src@2198378) (@matyhtf)