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