fopen ()разрывов URL для доменных имен, а не для числовых адресов

После нескольких часов попыток отладить стороннее -приложение, имеющее проблемы с 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"));'

Успех. Обратите внимание, что как пользователь веб-сервера я могу пропинговать www.google.com, и он прекрасно разрешается.

Я проследил оба исполнения PHP, и они расходятся вот так:

Для числового URL версии 4:

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 даже не пытался ничего сделать с этим сокетом. Или даже разрешить домен, если уж на то пошло. ВТФ?

Перекомпиляция PHP с поддержкой ipv6 или без нее, похоже, не имеет значения. Отключение 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 пытается разрешить доменное имя? Я попытался переключить свой преобразователь с 127.0.0.1 на ::1 в resolv.conf, и это не помогло.

10
задан b0fh 1 July 2012 в 20:44
поделиться