gpt4 book ai didi

php - URL 的 fopen() 中断域名,而不是数字地址

转载 作者:IT王子 更新时间:2023-10-29 00:07:58 27 4
gpt4 key购买 nike

在尝试调试第三方应用程序时遇到 fopen() 问题后,我终于发现了这一点

php -r 'echo(file_get_contents("http://www.google.com/robots.txt"));'

失败了,但是

php -r 'echo(file_get_contents("http://173.194.32.81/robots.txt"));'

成功。请注意,作为网络服务器用户,我可以 ping www.google.com 并且它解析得很好。

我跟踪了 PHP 的两个执行,它们的区别如下:

对于数字 v4 URL:

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("173.194
poll([{fd=3, events=POLLOUT}], 1, 0) = 0 (Timeout)
...[bunch of poll/select/recvfrom]...
close(3) = 0

对于域名:

socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
close(3) = 0

PHP 似乎甚至没有尝试对那个套接字做任何事情。就此而言,甚至可以解析域。什么鬼?

在支持或不支持 ipv6 的情况下重新编译 PHP 似乎并不重要。在此系统上禁用 ipv6 是不可取的。

Gentoo Linux,PHP 5.3.14,目前正在尝试 PHP 5.4,看看是否有帮助。有人有想法吗?

编辑:

php -r 'echo gethostbyname("www.google.com");'

工作并产生 ipv4,而

php -r 'echo(file_get_contents("http://[2a00:1450:4007:803::1011]/"));'

似乎返回一个空白结果。

编辑 2:

我什至没有注意到,使用名称时打开的 v6 套接字是一个 SOCK_DGRAM。这是 PHP 试图解析域名吗?我尝试在 resolv.conf 中将我的解析器从 127.0.0.1 切换到::1,但没有帮助。

最佳答案

GDB 显示那个神秘的未使用套接字调用实际上来自 libcurl。我在没有 libcurl 的情况下重新编译了 php,它可以工作。我会继续调查原因,但到目前为止,解决方法似乎有效。

关于php - URL 的 fopen() 中断域名,而不是数字地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11254310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com