当前位置: 首页 > 后端技术 > PHP

Swoolev4.7版本预览支持的c-ares

时间:2023-03-29 14:29:11 PHP

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流、sockets等。dnsLookup函数原型:Swoole\Coroutine\System::dnsLookup(string$domain,float$timeout=5):string|false与Coroutine\System::gethostbyname不同,Coroutine\System::dnsLookup是基于Co\SocketUDP客户端自行实现的DNS协程客户端,底层是异步的IO,而不是使用libc提供的gethostbyname函数。启用c-ares后,也会被c-ares实现所取代。该功能在Swoole版本>=v4.4.3时可用,底层会读取/etc/resolve.conf获取DNS服务器地址,之前的版本只支持AF_INET(IPv4)域名解析,这个版本还增加了对IPv6Coroutine\System::dnsLookup增加第三个参数用于选择IPv4(AF_INET)或IPv6(AF_INET6),默认为IPv4Swoole\Coroutine\System::dnsLookup(string$domain,float$timeout=5,int$type=AF_INET):string|false示例代码IPv6useSwoole\Coroutine\System;usefunctionSwoole\Coroutine\run;run(function(){var_dump(System::dnsLookup('www.taobao.com',3,AF_INET6));});启用c-ares后,strace日志会变成纯异步IO,下面是strace日志useSwoole\Coroutine\System;usefunctionSwoole\Coroutine\run;run(function(){$ip=System::gethostbyname("www.taobao.com",AF_INET,0.5);echo$ip;});epoll_create(512)=3clock_gettime(CLOCK_MONOTONIC,{tv_sec=2244208,tv_nsec=658303392})=0mmap(NULL,2101248,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)=0x7f4173b8c000clock_gettime(CLOCK_MONOTONIC,{tv_sec=2244208,tv_nsec=658417744})=0open("/etc/resolv.conf",O_RDONLY)=4fstat(4,{st_mode=S_IFREG|0644,st_size=89,...})=0mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)=0x7f41832b9000read(4,";由/usr/sbin/dhclien生成"...,4096)=89read(4,"",4096)=0close(4)=0munmap(0x7f41832b9000,4096)=0mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)=0x7f41832b9000read(4,"t\205\3006\273`\271\375\377\273\376\261a\246VP\304Y-\4[\20619@\370\23N\1\223>"...,4096)=4096close(4)=0munmap(0x7f41832b9000,4096)=0open("/etc/hosts",O_RDONLY)=4fstat(4,{st_mode=S_IFREG|0644,st_size=242,...})=0mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)=0x7f41832b9000read(4,"127.0.0.1VM-32-17-centosVM-32-"。..,4096)=242read(4,"",4096)=0close(4)=0munmap(0x7f41832b9000,4096)=0clock_gettime(CLOCK_MONOTONIC,{tv_sec=2244208,tv_nsec=659074426})=0socket(AF_INET,SOCK_DGRAM,IPPROTO_IP)=4fcntl(4,F_GETFL)=0x_2(flagsOtRDWl,Fcn_2(flags)O_RDWR|O_NONBLOCK)=0fcntl(4,F_SETFD,FD_CLOEXEC)=0connect(4,{sa_family=AF_INET,sin_port=htons(53),sin_addr=inet_addr("183.60.82.98")},16)=0epoll_ctl(3,EPOLL_CTL_ADD,4,{EPOLLIN,{u32=37374768,u64=37374768}})=0sendto(4,"f\330\1\0\0\1\0\0\0\0\0\0\3www\5baidu\3com\0\0\1\0\1",31,MSG_NOSIGNAL,NULL,0)=31clock_gettime(CLOCK_MONOTONIC,{tv_sec=2244208,tv_nsec=659365294})=0clock_gettime(CLOCK_MONOTONIC,{tv_sec=2244208,tv_nsec=9659})=0clock_gettime(CLOCK_MONOTONIC,{tv_sec=2244208,tv_nsec=659414437})=0epoll_wait(3,[{EPOLLIN,{u32=37374768,u64=37374768}}],4096,500)=1secclock_gettime(CLOCK_tONIC=,{2244208,tv_nsec=660754983})=0recvfrom(4,"f\330\201\200\0\1\0\3\0\0\0\0\3www\5baidu\3com\0\0\1\0\1\300"...,4097,0,{sa_family=AF_INET,sin_port=htons(53),sin_addr=inet_addr("183.60.82.98")},[16])=90epoll_ctl(3,EPOLL_CTL_DEL,4,NULL)=0close(4)=0clock_gettime(CLOCK_MONOTONIC,{tv_sec=2244208,tv_nsec=660917518})=0write(1,"110.242.68.4",12110.242.68.4)=12