在使用curl异步并发请求时如果有大量域名解析会长时间阻塞程序IO,可以编译升级libcurl以支持异步DNS解析。
Centos7自带libcurl已支持异步DNS支持,不过是--enable-threaded-resolver,可以使用curl-config --configure查看curl编译参数。
查看Libcurl是否已支持异步DNS解析,包含AsynchDNS为支持:
1 2 3 4 | curl --version curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.40.0 OpenSSL/1.0.1e zlib/1.2.3 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM SSL libz |
首先安装异步DNS解析库c-ares:
1 | yum install c-ares-devel openssl-devel |
编译libcurl库:
1 2 3 4 5 | wget http: //curl .haxx.se /download/curl-7 .40.0. tar .gz tar zxvf curl-7.40.0. tar .gz cd curl-7.40.0/ . /configure -- enable -ares --prefix= /usr/local/curl --with-ssl make && make install |
查看编译安装的curl信息,已经支持了异步DNS解析库c-ares:
1 2 3 4 | /usr/local/curl/bin/curl --version curl 7.40.0 (x86_64-unknown-linux-gnu) libcurl/7.40.0 OpenSSL/1.0.1e zlib/1.2.7 c-ares/1.10.0 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets |
将libcurl动态库添加到动态链接库:
1 2 | echo '/usr/local/curl/lib' > /etc/ld .so.conf.d /libcurl .conf ldconfig |
安装完毕,重启PHP-FPM,查看phpinfo可以看到新的CURL
使用libcurl库看是否支持c-ares:
1 2 3 4 5 6 7 8 9 10 11 | #include <curl/curl.h> int main() { curl_version_info_data*info=curl_version_info(CURLVERSION_NOW); if (info->features&CURL_VERSION_ASYNCHDNS) { printf ( "ares enabled\n" ); } else { printf ( "ares NOT enabled\n" ); } return 0; } |