PHP5 - не удается разрешить имена хостов, когда не в интерактивном режиме - PullRequest
3 голосов
/ 08 февраля 2010

Я работаю с сервером OS X 10.6, работающим под управлением Apache2 / PHP5, и имею проблему с PHP, который не разрешает имена хостов, когда fopen () пытается получить файл с удаленного сервера. При запуске в интерактивном режиме в командной строке «fopen ()» работает отлично. Однако при запуске через Интернет он всегда завершится ошибкой:

failed to open stream: php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

Я не могу найти источник этой проблемы: 'fopen ()' работает в сети, когда ему присваивается IP-адрес вместо имени хоста; 'gethostbyname ()' также завершается ошибкой при запуске в Интернете (он не выдает ошибку, он просто возвращает имя хоста, которое было дано для разрешения), но также отлично работает при запуске в интерактивном режиме. Единственное исключение, по-видимому, - dns_get_record (), которое отлично работает при запуске в Интернете или в интерактивном режиме.

Я пытался найти проблемы DNS на сервере, но dig, nslookup и ping всю работу, и "scutil -r" говорит, что удаленный сервер доступен с текущими настройками DNS. Любые идеи о том, где может быть проблема?

Ответы [ 6 ]

3 голосов
/ 07 сентября 2010

Попробуйте перекомпилировать PHP с параметром --disable-ipv6. Затем apachectl stop & start (не «apachectl restart»). У меня такое же сообщение об ошибке в Mac OS 10.6.4 + скомпилированный вручную PHP5.3.3 + Apache2.2.16.

2 голосов
/ 16 августа 2014

Если вы используете PHP-FPM с настройками chroot (как и должно быть) - тогда ни DNS, ни почта не будут работать.


Обновление февраль 2016

strace с использованием gethostbyname только из сценария тестирования @ https://knzl.de/setting-up-a-chroot-for-php/ решено dns для меня в Alpine Linux / nginx chroot. Я также использую sh по этой ссылке с mini-sendmail для решения проблемы mail.


Примерный список файлов, необходимых для DNS & Mail в chroot

Следующие команды заставили DNS работать с PHP5.5 на Debian (протестировано с помощью встроенного компонента обновления Joomla):

#!/bin/sh

chroot=/var/www
domain=mydomain
webuser=www-data
webgroup=www-data

cd $chroot/$domain

mkdir etc

cp /etc/resolv.conf etc/
cp /etc/nsswitch.conf etc/
echo $(cat /etc/group|grep $webgroup) > etc/group
echo $(cat /etc/passwd|grep $webuser) > etc/passwd
cp /etc/services etc/
cp /etc/protocols etc/
cp /etc/host.conf etc/
cp /etc/hosts etc/
cp /etc/networks etc/

mkdir -p usr/bin   
mkdir usr/sbin

cp /usr/sbin/ssmtp usr/sbin/
cp /usr/sbin/sendmail usr/sbin/

mkdir usr/share

cp -rf /usr/share/zoneinfo usr/share

mkdir lib

cp /lib/i386-linux-gnu/libresolv.so.2 lib/
cp /lib/i386-linux-gnu/libnss_compat.so.2 lib/
cp /lib/i386-linux-gnu/libc.so.6 lib/
cp /lib/i386-linux-gnu/libnsl.so.1 lib/
cp /lib/i386-linux-gnu/libnss_files.so.2 lib/
cp /lib/i386-linux-gnu/libz.so.1 lib/
cp /lib/i386-linux-gnu/libdl.so.2 lib/
cp /lib/i386-linux-gnu/libcidn.so.1 lib/
cp /lib/i386-linux-gnu/ld-linux.so.2 lib/
cp /lib/i386-linux-gnu/libcrypt.so.1 lib/
cp /lib/i386-linux-gnu/libnss_nis.so.2 lib/
cp /lib/i386-linux-gnu/libnss_dns.so.2 lib/

chown -R $webuser:$webgroup lib usr etc
service php5-fpm restart

Мне не нужны / bin / sh или / usr / lib / locale

2 голосов
/ 08 февраля 2010

Вы должны правильно установить значение allow_url_fopen вашего php.ini.

http://ar.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen

Предположим, что CLI использует другой php.ini, чем веб-сервер (я полагаю, вы используете Apache).

Возможно, вы не включаете libnss_dns

Попробуйте добавить в свою конфигурацию httpd (правильный путь, необходимый для вашей системы):

LoadFile /lib/libnss_dns.so
1 голос
/ 17 августа 2014

Та же проблема, иное решение, чем у оригинального постера. Я звонил mysqli (...) для подключения, но URL, который я имел для сервера, был неправильным. Так что это не всегда означает, что вы не можете выполнить какой-либо поиск DNS, просто сервер, который не может выполнить этот конкретный поиск (проверьте ваш хост!)

0 голосов
/ 06 февраля 2014

Какое имя хоста вы пытались разрешить? У меня была такая же проблема с localhost.

Это не сработало, и я получил вашу ошибку. Я изменил имя хоста на 127.0.0.1, чем он работал. Не лучшее решение, но хорошее решение.

0 голосов
/ 14 января 2012

Отключите IPv6 в конфигурации TCP / IP в настройках сети.

...