file_get_contents()报错gethostbyname failed的原因

今天,一台测速VPS的PHP程序运行出现了问题,一直以来都运行得好好的,怎么会突然运行不了呢?首先我想到的是Web服务器IIS的问题,于是重启IIS,但是并不凑效;随后重启服务器,但是问题依旧,这让我一时不知道怎么处理为好。于是,开始分析起错误日志起来。

报错提示:gethostbyname failed

其实PHP程序执行并没有问题,说明PHP环境是没有被破坏的。出问题的是某些程式(函数)不能执行,报错提示如下:

Warning: get_headers() [function.get-header]: php_network_getaddresses: gethostbyname failed. errno = 0

Warning: get_headers(http://m.baidu.com) [function.get-header]: failed to open stream: php_network_getaddresses: gethostbyname failed. errno = 0

Notice: Undifined offset:1

Warning: file_get_contents() [function.file-get-contents]: php_network_getaddresses: gethostbyname failed. errno = 0

Warning: file_get_contents() [function.file-get-contents]: failed to open stream: php_network_getaddresses: gethostbyname failed. errno = 0

根据报错提示,PHP运行出错的地方是get_headers()file_get_contents(),而原因均为gethostbyname失败。意思是获取不了域名主机,即是域名解析失败了。

解决方法

域名解析失败,问题找到了,但是原因是什么,以及如何解决呢?

根据以往的经验,服务器不能解析域名,原因多是DNS的设置的问题,于是就从DNS的设置做起。

服务器的DNS原先是一个当地联通的DNS,我现在把服务器的DNS设为8.8.8.8这个公共DNS看看。

然后,在dos里ping一下域名,看到可以ping通了。

 

检测网络连通与否

再次访问PHP程序,终于没问题了!

总结

本次经验是,当在服务器访问不了外网网站时,试试更改下服务器的DNS,DNS对网络的连通性起到十分重要的作用。