2010-02-08 2 views
3

Apache2/PHP5를 실행하는 OS X 10.6 Server에서 작동하고 'fopen()'에서 파일을 검색하려고 할 때 PHP가 호스트 이름을 확인하지 못하는 문제가 있습니다. 원격 서버. 명령 행에서 대화식 모드로 실행하면 'fopen()'이 완벽하게 작동합니다. IP 주소를 부여 할 때 '는 fopen()'웹에서 작동합니다PHP5 - 대화 형 모드가 아닌 경우 호스트 이름을 확인하지 못함

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

나는이 문제의 원인을 찾는 손실에있어 : ​​웹을 통해 실행할 때, 항상 오류와 함께 실패합니다 호스트 이름 대신; 'gethostbyname()'은 웹에서 실행될 때도 실패합니다 (오류가 아니며 해결할 호스트 이름을 반환합니다). 대화 형 모드에서 실행하면 잘 작동합니다. 유일한 예외는 'dns_get_record()'인 것처럼 보입니다. 웹에서 또는 대화식 모드로 실행될 때 제대로 작동합니다.

나는 서버에서 DNS 문제를 찾으려고했지만 dig, nslookup 및 모든 작업을 ping하고 "scutil -r"은 원격 서버에 현재 DNS 설정으로 연결할 수 있다고 말합니다. 문제가있는 위치에 대한 아이디어가 있습니까?

답변

2

php.ini의 allow_url_fopen 값을 올바르게 설정해야합니다.

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

은 CLI는 웹 서버가 (난 당신이 아파치를 사용한다고 가정) 다른 php.ini 파일을 사용하여 고려하십시오. --disable- '로 PHP를 재 컴파일 할

LoadFile /lib/libnss_dns.so 
+0

allow_url_fopen()이 문제라고 생각하지 않습니다. 여기서는 PHP.ini를 비교하는 것이 좋습니다. –

+1

죄송 합니다만, 저는 allow_url_fopen()을 사용하기 위해 Apache에서 PHP.ini를 사용하고 있는지 확인해야한다고 명시해야합니다. 나는 'libnss_dns.so'을 조사하고 있지만 OS X 10.6 또는 Apache2의 MacPorts 배포판에서 찾을 수 없었습니다. 처음 게시 할 때 중요하다고 생각하지는 않았지만이 문제는 몇 달 전에 처음 발생했으며 원격 서버를 '/ etc/hosts'에 추가하여이 문제를 해결할 수있었습니다. 현재 문제가 무엇이든간에 '호스트'파일을 수동으로 편집하는 것은 도움이되지 않습니다. – Kaja

+2

MacPorts 1.9.1에서도이 오류가 발생했습니다. ldns (sudo port install ldns)를 설치하면 문제가 해결되었습니다. – richardkmiller

3

시도를 :

또 다른 옵션은

시도가 (당신이 시스템에 필요한 올바른 경로) 당신의 아파치 구성에 추가 libnss_dns 포함되지 않습니다 수 있습니다 ipv6 '옵션을 사용하십시오. 그런 다음 apachectl stop &을 시작하십시오 ('apachectl restart'아님). Mac OS 10.6.4 + 수동으로 컴파일 된 PHP5.3.3 + Apache2.2.16에서 같은 오류 메시지가 나타납니다.

+0

나는 이것이 오래되었다는 것을 알고있다. 그러나 나는이 정확한 문제를 가지고 있었고 ipv6 지원을 제거하는 것이 나를 위해 그것을 고쳤다. – DTest

-1

net 기본 설정의 TCP/IP 구성에서 IPv6을 비활성화하십시오.

+3

근본적인 문제를 해결하는 것이 더 좋은 생각 일 것이다. – Flexo

0

해결하려는 호스트 이름은 무엇입니까? 나는 localhost와 같은 문제가 있었다.

이것은 작동하지 않았고 오류가 발생했습니다. 호스트 이름을 127.0.0.1로 변경했습니다. 최상의 솔루션은 아니지만 문제 해결에 좋습니다.

+0

이것은 PHP mysqli 명령에 나열된 문제입니다 (localhost는 마술이므로 직접 연결하려고 할 때 IP 127.0.0.1을 사용해야합니다). – BadPirate

1

PHP-FPM을 chroot 설정으로 실행중인 경우 DNS와 메일 모두 작동하지 않습니다.


업데이트 2016년 2월

straceAlpine Linux/nginx chroot에 나를 위해 dns를 해결https://knzl.de/setting-up-a-chroot-for-php/ @테스트 스크립트에서 gethostbyname를 사용하여. 또한이 링크의 shmini-sendmail과 함께 사용하여 mail 문제를 해결합니다.

#!/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 

:


DNS & Mail in a chroot

다음 명령에 필요한 파일의 대략적인 목록은 데비안에 PHP5.5 나를 위해 일하는 DNS가 (줌라 내장 업데이트 구성 요소 테스트) 도착 나는/bin/sh 또는/usr/lib/locale을 필요로하지 않았다.

+0

네,이 작품도 나와 있습니다. (libnss_dns.so도 있습니다. .2 및 libnss_files.so.2) - 당신이 [chroot]/usr/share/zoneinfo를 살펴 본다면/etc/localtime에 대한 누락 된 심볼릭 링크가 생길 것입니다 (귀하의 절차에서 빠진 것처럼 보입니다). 필요하다 – jakabadambalazs

+0

php cURL을 사용하려면 chrooted 환경에서 curl 바이너리가 필요하지 않습니다. 사실 Joomla는 php5-curl 패키지를 설치하지 않아도 업데이트됩니다. 그러나 당신이 그것을 필요로하고 그것을 설치한다면, 그것은 chroot에서 curl 바이너리 (그리고 그것의 라이브러리들)없이 완벽하게 작동합니다. – jakabadambalazs

+0

@ jakabadambalazs - 예'curl' 바이너리는 필요하지 않습니다. - 현재 방법으로 지침에 대한 업데이트를 추가했습니다. –

1

같은 문제, 다른 해결책은 원래의 포스터. 연결하려고 mysqli (...)를 호출했지만 서버에 대해 가지고있는 URL이 잘못되었습니다. 그래서 항상 DNS 조회를 할 수 없다는 의미는 아닙니다. 서버가 특정 조회를 수행 할 수 없다는 것입니다 (호스트를 확인하십시오!)