php fopen 函数不能获取远程地址内容

fopen函数在php中多半是用于读写文件了,但有时也用于获取远程服务器的文件,但我们在使用fopen读取远程文件时需要开启allow_url_fopen才可以哦。

解决过程,首先排除了DNS的问题,因为除了这几个函数,其他一切工作正常。虽然是带域名的URL才有问题,但gethostbyname() 这个函数却可以得到正确返回。 然后想到的是php.ini 的配置问题——但发现allow_url_fopen 已经打开。 之后寻求Google帮忙,有人提及是SELINUX的问题。可我压根没有打开SELINUX。继续Google之,发现了StackOverflow的这篇,代码如下:

  1. $file = fopen('http://www.phpfensi.com/''rb'); 
  2. var_dump(stream_get_meta_data($file)); 
  3. /* 

输出结果:

  1. array(10) { 
  2.   ["wrapper_data"]=> 
  3.   array(2) { 
  4.     ["headers"]=> 
  5.     array(0) { 
  6.     } 
  7.     ["readbuf"]=> 
  8.     resource(38) of type (stream) 
  9.   } 
  10.   ["wrapper_type"]=> 
  11.   string(4) "cURL" 
  12.   ["stream_type"]=> 
  13.   string(4) "cURL" 
  14.   ["mode"]=> 
  15.   string(2) "rb" 
  16.   ["unread_bytes"]=> 
  17.   int(0) 
  18.   ["seekable"]=> 
  19.   bool(false
  20.   ["uri"]=> 
  21.   string(23) "http://www.phpfensi.com/" 
  22.   ["timed_out"]=> 
  23.   bool(false
  24.   ["blocked"]=> 
  25.   bool(true
  26.   ["eof"]=> 
  27.   bool(false
  28. }*/ 

要使用fopen、getimagesize或include等函数打开一个url,需要对php.ini进行设置,通常设置allow_url_fopen为on允许fopen url,设置allow_url_include为on则允许include/require url,但在本地测试环境下却不一定管用

  1. allow_url_fopen = on 
  2. Whether to allow the treatment of URLs (like http:// or ftp://) as files. 
  3. allow_url_include = on 
  4. Whether to allow include/require to open URLs (like http:// or ftp://) as files. 

在本地wamp测试环境中,这样设置以后,fopen可以正常打开远程地址,但遇到本地的地址却会报错,例如代码如下:

fopen("http://localhost/myfile.php", "r"); 

就会在超过php.ini中设置的脚本最长执行时间后报错,告知文件不存在等。这在在线服务器上是不会出现的,但如果将localhost替换成127.0.0.1,却可以正常工作。

从状况看,问题出在DNS解析上,按理说localhost已经自动被映射到127.0.0.1,实际上访问http://localhost和访问http://127.0.0.1也到达同一个地址。

解决的方法就是检查一下Windows的host文件,通常位于system32目录下,一个系统盘是C盘的host路径如下所示

C:/Windows/System32/drivers/etc/hosts

打开hosts文件,用记事本或者notepad++等工具,将下面的127.0.0.1前面的#去掉即可,代码如下:

  1. # localhost name resolution is handled within DNS itself.  
  2. #   127.0.0.1       localhost 

将url视为文件有什么用,比如给include的文件传值,可以这样

在example.inc.php中

  1. <!–?php      
  2. var_dump($_GET['foo']);     
  3. var_dump($_GET['bar']);  
  4. ?> 

运行结果:string(1) "1" string(1) "2"

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » php fopen 函数不能获取远程地址内容

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡