PHP CURL(7.48.0)在/ etc / hosts中解析DNS

时间:2016-11-01 09:23:21

标签: php linux curl dns

我遇到了一个关于php curl的奇怪问题。

它将连接到DNS服务器以解析,即使主机位于/ etc / hosts!

软件版本:


    Server :
    CentOS release 6.3 (Final)


    Linux Curl version :
    curl --version
    curl 7.47.1 (x86_64-pc-linux-gnu) libcurl/7.47.1 OpenSSL/1.0.1e zlib/1.2.3   libidn/1.18
    Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3    pop3s rtsp smb smbs smtp smtps telnet tftp
    Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets`


    PHP version :
    php -v
    PHP 5.4.41 (cli) (built: Aug 11 2015 22:29:40)
    Copyright (c) 1997-2014 The PHP Group
    Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies


    PHP curl version : 
    php -r "var_export(curl_version());"
    array (
    'version_number' => 471040,
    'age' => 3,
    'features' => 952221,
    'ssl_version_number' => 0,
    'version' => '7.48.0',
    'host' => 'x86_64-redhat-linux-gnu',
    'ssl_version' => 'OpenSSL/1.0.1e',
    'libz_version' => '1.2.3',

服务器配置:


    /etc/hosts : 
    127.0.0.1 lalala.examplekkk.com


    /etc/resolv.conf : 
    nameserver 8.8.8.8


    /etc/nsswitch.conf
    hosts:      files dns

命令执行结果:


    PING lalala.examplekkk.com (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.041 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.035 ms
    ....


    strace php -r '$curl=curl_init();$url="http://lalala.examplekkk.com";curl_setopt($curl,CURLOPT_URL,$url);$content=curl_exec($curl);echo $content;'
    ...
    open("/etc/hosts", O_RDONLY)            = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=1308, ...}) = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f85c7b5c000
    read(3, "127.0.0.1   localhost localhost."..., 4096) = 1308
    ...
    fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
    connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("8.8.8.8")}, 16) = 0
    sendto(3, "\177{\1\0\0\1\0\0\0\0\0\0\6lalala\nexamplekkk\3c"..., 39, MSG_NOSIGNAL, NULL, 0) = 39
    poll([{fd=3, events=POLLIN|POLLRDNORM}], 1, 0) = 0 (Timeout)
    ...

我很困惑,为什么PHP curl需要连接到DNS服务器来解析主机名?

我执行命令' strace curl' http://lalala.examplekkk.com',并且没有连接到8.8.8.8就可以了。

这是php-curl中的错误吗?

1 个答案:

答案 0 :(得分:0)

摘要:CURLOPT_RESOLVE是解决您问题的方法。

来自https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html

  

为IP地址解析提供自定义主机名。

如果使用PHP实现,则必须提供一个至少包含一个元素的数组。 cURL仅查看数组值,而不查看键。

  

每个单个名称解析字符串应使用以下格式编写:HOST:PORT:ADDRESS [,ADDRESS] ...其中HOST是libcurl将尝试解析的名称,PORT是libcurl要连接的服务的端口号到“主机”和“地址”中的是一个或多个数字IP地址。

以下是使用您的值的更完整示例:

$curl = curl_init();
$options = [
  CURLOPT_RESOLVE => ['lalala.examplekkk.com:80:127.0.0.1'],
  CURLOPT_URL => "http://lalala.examplekkk.com/",
  CURLOPT_RETURNTRANSFER => 1,
];
curl_setopt_array($curl, $options); 
$content = curl_exec($curl);

这不是错误,它是有据可查的行为。

据我所知,您无法告诉cURL使用/etc/hosts文件。如果不正确,请发表评论。