Swoole v4.7 版本预览之支持 c-ares

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: c-ares 是一个异步 DNS 解析库。 它适用于需要在不阻塞的情况下执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。

c-ares 是什么?

c-ares 是一个异步 DNS 解析库。 它适用于需要在不阻塞的情况下执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。

默认不开启,如需开启,需要在编译 Swoole 时增加 --enable-cares 参数

gethostbyname


在之前的版本中 Coroutine\System::gethostbyname 是基于同步的线程池模拟实现,底层自动进行协程调度,

依赖操作系统和 AIO 线程池,导致并发能力较弱,而启用 c-ares 之后会变成纯异步 IO 的。

启用 c-ares 之后,所有的网络客户端在解析域名时都会使用 c-ares ,包括 Redis、MySQL、HttpClient ,以及 PHP 的 Hook stream、sockets 之类

dnsLookup


函数原型:

Swoole\Coroutine\System::dnsLookup(string$domain, float$timeout = 5): string|false

Coroutine\System::gethostbyname 不同,Coroutine\System::dnsLookup 是基于 Co\Socket UDP 客户端自行实现的 DNS 协程客户端,

底层是异步 IO,而不是使用 libc 提供的 gethostbyname 函数。在开启 c-ares 之后也会被替换成 c-ares 实现。

此函数在 Swoole 版本 >= v4.4.3 时可用,底层会读取 /etc/resolve.conf 获取 DNS 服务器地址,之前版本中仅支持 AF_INET(IPv4) 域名解析,此版本中对于 IPv6 也增加了支持

对于 Coroutine\System::dnsLookup 增加了第三个参数,用于选择 IPv4 (AF_INET) 还是 IPv6 (AF_INET6),默认为 IPv4

Swoole\Coroutine\System::dnsLookup(string $domain, float $timeout = 5, int $type = AF_INET): string|false

示例代码


  • IPv6
use Swoole\Coroutine\System;
use function Swoole\Coroutine\run;
run(function () {
    var_dump(System::dnsLookup('www.taobao.com', 3, AF_INET6));
});

strace 日志


启用 c-ares 之后会变成纯异步 IO,以下为 strace 日志

use Swoole\Coroutine\System;
use function Swoole\Coroutine\run;
run(function () {
    $ip = System::gethostbyname("www.taobao.com", AF_INET, 0.5);
    echo $ip;
});
epoll_create(512)                       = 3
clock_gettime(CLOCK_MONOTONIC, {tv_sec=2244208, tv_nsec=658303392}) = 0
mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4173b8c000
clock_gettime(CLOCK_MONOTONIC, {tv_sec=2244208, tv_nsec=658417744}) = 0
open("/etc/resolv.conf", O_RDONLY)      = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=89, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41832b9000
read(4, "; generated by /usr/sbin/dhclien"..., 4096) = 89
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0x7f41832b9000, 4096)            = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41832b9000
read(4, "t\205\3006 \273`\271\375\377\273\376\261a\246VP\304Y-\4[\20619@\370\23N\1\223>"..., 4096) = 4096
close(4)                                = 0
munmap(0x7f41832b9000, 4096)            = 0
open("/etc/hosts", O_RDONLY)            = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=242, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41832b9000
read(4, "127.0.0.1 VM-32-17-centos VM-32-"..., 4096) = 242
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0x7f41832b9000, 4096)            = 0
clock_gettime(CLOCK_MONOTONIC, {tv_sec=2244208, tv_nsec=659074426}) = 0
socket(AF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
fcntl(4, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
目录
相关文章
|
安全 API 网络安全
Swoole v4.6.0 版本发布,支持原生 curl 协程客户端
Swoole v4.6.0 版本发布了,同样也是 2021 年的首个版本更新。 作为一个 y 版本发布,此次更新也包含了不兼容的修改以及许多的新功能
729 0
|
6月前
|
API C# 图形学
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
139 1
|
JavaScript 数据库连接 Linux
Swoole v5.0 版本新特性预览之新的运行模式
PHP 8.1 版本已经在 2021年 11 月 25 日发布了,Swoole 也在第一时间进行了兼容处理,但由于强类型的一些限制,都会导致一些BC的情况发生。 于是目前将master分支不再作为 4.9版本发布,而调整为 5.0版本发布,预计发布时间为农历新年后。
521 1
|
网络协议 安全 网络安全
Swoole v4.6 版本新特性之 SNI 支持
Swoole 在 v4.6.0 版本中对 SNI 进行了支持,这篇文章就对这个新特性进行一些演示和说明。
220 0
Swoole v4.6 版本新特性之 SNI 支持
|
缓存 IDE Ubuntu
yasd 调试器 v0.2.5 版本发布,支持 PHP8 以及在 IDE 中使用调试
有小伙伴提交 issue,询问是否支持 PhpStorm 以及 VScode,那么它来了
455 0
yasd 调试器 v0.2.5 版本发布,支持 PHP8 以及在 IDE 中使用调试
|
API 调度 PHP
Swoole v4.7 版本新特性预览之 Co::cancel()
相信之前就有很多用户想要一个取消协程的 API,迟迟没有添加进来,现在在 v4.7 版本中进行了添加: 具体实现见:#4247 ,#4249
185 0
Swoole v4.7 版本新特性预览之 onDisconnect 事件回调
在之前的版本中可能有这样一种情况,在 WebSocket 服务器中无法在 close 事件回调中区分该 fd 是否为 WebSocket 连接
181 0
|
网络协议
Swoole v4.7 版本新特性预览之支持为每个端口设置不同的心跳检测时间
在之前的版本中,多端口监听的心跳检测功能只能配置在主服务上,无法为每个端口单独设置心跳时间。 例如需要在9501端口上设置 30 秒,而9502端口上设置 60 秒。从v4.7版本开始进行了支持.
193 0
|
安全 NoSQL API
Swoole v4.8.0 版本发布,增加 Swoole Dashboard 面板
此版本包含了新功能、BUG 修复以及向下不兼容的改动。
403 0
|
网络协议 关系型数据库 MySQL
Swoole v4.7.0 版本正式发布,Swoole 官网支持直接运行 Swoole 代码
在 Swoole 官网增加了 在线运行 的按钮,可以直接运行首页提供的一些示例代码,当然也可以手动输出一些 PHP 代码进行测试。 可以访问 Swoole 官网首页进行测试使用:https://www.swoole.com/ 目前还处于测试阶段,有遇到 BUG 可以向识沃科技客服反馈或交流群中反馈。
261 0
下一篇
无影云桌面