【问题标题】:PHP CURL(7.48.0) DNS resolve in /etc/hostsPHP CURL(7.48.0) DNS 解析在 /etc/hosts
【发布时间】:2017-03-14 10:06:45
【问题描述】:

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

它会连接到DNS服务器来解析,即使主机在/etc/hosts中!

软件版本:

服务器 : CentOS 6.3 版(最终版) Linux 卷曲版本: 卷曲--版本 curl 7.47.1 (x86_64-pc-linux-gnu) libcurl/7.47.1 OpenSSL/1.0.1e zlib/1.2.3 libidn/1.18 协议: dict 文件 ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 特点:IDN IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets` PHP版本: php -v PHP 5.4.41 (cli)(构建:2015 年 8 月 11 日 22:29:40) 版权所有 (c) 1997-2014 PHP 集团 Zend Engine v2.4.0,版权所有 (c) 1998-2014 Zend Technologies PHP卷曲版本: php -r "var_export(curl_version());" 大批 ( '版本号' => 471040, '年龄' => 3, '功能' => 952221, 'ssl_version_number' => 0, '版本' => '7.48.0', '主机' => '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 : 名称服务器 8.8.8.8 /etc/nsswitch.conf 主机:文件 dns

命令执行结果:

PING lalala.examplekkk.com (127.0.0.1) 56(84) 字节数据。 来自 localhost (127.0.0.1) 的 64 个字节:icmp_seq=1 ttl=64 time=0.041 ms 来自 localhost (127.0.0.1) 的 64 个字节: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 ;' ... 打开(“/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 读取(3,“127.0.0.1 本地主机本地主机。”...,4096)= 1308 ... fcntl(3, F_SETFD, FD_CLOEXEC) = 0 连接(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 (超时) ...

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

我执行命令'strace curl'http://lalala.examplekkk.com',不用连接8.8.8.8就可以了。

它是 php-curl 中的错误吗?

【问题讨论】:

标签: php linux curl dns


【解决方案1】:

总结:CURLOPT_RESOLVE 是您问题的解决方案。

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

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

在 PHP 实现的情况下,您必须提供一个包含至少一个元素的数组。 cURL 只查看数组值,而不是键。

每个名称解析字符串都应使用格式 HOST:PORT:ADDRESS[,ADDRESS]... 其中 HOST 是 libcurl 将尝试解析的名称,PORT 是 libcurl 想要连接的服务的端口号到 HOST 和 ADDRESS 是一个或多个数字 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 文件。如有不妥,请留言。

【讨论】:

    猜你喜欢
    • 2015-07-10
    • 2012-03-05
    • 2019-09-24
    • 1970-01-01
    • 2021-12-02
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多