距离上个版本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 版本后,前往 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) //} 复制代码
更新日志
下面是完整的更新日志:
向下不兼容改动
新增 API
新增功能
增强
修复
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!