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

解决过程

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

 代码如下 复制代码

$file = fopen('http://www.google.com/', 'rb');
var_dump(stream_get_meta_data($file));

/*
输出结果:
array(10) {
  ["wrapper_data"]=>
  array(2) {
    ["headers"]=>
    array(0) {
    }
    ["readbuf"]=>
    resource(38) of type (stream)
  }

  ["wrapper_type"]=>
  string(4) "cURL"

  ["stream_type"]=>
  string(4) "cURL"

  ["mode"]=>
  string(2) "rb"

  ["unread_bytes"]=>
  int(0)

  ["seekable"]=>
  bool(false)

  ["uri"]=>
  string(23) "http://www.google.com/"

  ["timed_out"]=>
  bool(false)

  ["blocked"]=>
  bool(true)

  ["eof"]=>
  bool(false)

}*/

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

allow_url_fopen = on

Whether to allow the treatment of URLs (like http:// or ftp://) as files.

allow_url_include = on

Whether to allow include/require to open URLs (like http:// or ftp://) as files.

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

 代码如下 复制代码
1 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前面的#去掉即可。

 代码如下 复制代码

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

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

 代码如下 复制代码

<?php include 'http://yourdomain.com/ example.inc.php?foo=1&bar=2'; ?>

在example.inc.php中

 代码如下 复制代码

<?php    
var_dump($_GET['foo']);   
var_dump($_GET['bar']);
?>

运行结果

string(1) "1" string(1) "2"

时间: 2024-07-30 21:12:30

php fopen 函数不能获取远程地址内容的相关文章

PHP 获取远程文件内容的函数代码_php技巧

如下函数: 复制代码 代码如下: <? /** 获取远程文件内容 @param $url 文件http地址 */ function fopen_url($url) { if (function_exists('file_get_contents')) { $file_content = @file_get_contents($url); } elseif (ini_get('allow_url_fopen') && ($file = @fopen($url, 'rb'))){ $i

php获取远程文件内容的函数_php技巧

一个简单的php获取远程文件内容的函数代码,兼容性强.直接调用就可以轻松获取远程文件的内容,使用这个函数也可获取图片.代码如下: /** * 读远程内容 * @return string */ function get_url_content($url){ if(function_exists("curl_init")){ $ch = curl_init(); $timeout = 30; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt

ajax获取远程文章内容代码

function $(elementId) {  //获取指定id的object  if (document.getElementById) {   return document.getElementById(elementId);  } else if (document.all) {   return document.all[elementId];  } else if (document.layers) {   return document.layers[elementId];  }

php获取远程文件的内容和大小_php技巧

本文实例总结了php获取远程文件的内容和大小的方法.分享给大家供大家参考.具体如下: 1.获取远程文件内容的方法 2.获取远程文件大小的方法 以上就是php获取远程文件的内容和大小函数代码,希望对大家的学习有所帮助.

解析PHP中的file_get_contents获取远程页面乱码的问题_php技巧

PHP的file_get_contents获取远程页面内容,如果是gzip编码过的,返回的字符串就是编码后的乱码1.解决方法,找个ungzip的函数来转换下2.给你的url加个前缀,这样调用$content = file_get_contents("compress.zlib://".$url);无论页面是否经过gzip压缩,上述代码都可以正常工作!使用curl模块同样可解决问题 复制代码 代码如下: function curl_get($url, $gzip=false){     

php curl采集远程页面内容演示代码

例  代码如下 复制代码 $curlPost = 'a=1&b=2';//模拟POST数据 $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:0.0.0.0', 'CLIENT-IP:0.0.0.0'));  //构造IP curl_setopt($ch, CURLOPT_REFERER, "http://www.111cn.net/");   //构造来路 curl_s

PHP 获取远程网页内容的代码(fopen,curl已测)

1.fopen的使用 复制代码 代码如下: <?php $handle = fopen ("http://s.jb51.net/", "rb"); $contents = ""; while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); echo $contents; //输出获取到得内容. ?> 复制代码 代码如下: // 对 PHP

同一域名对应多个IP时,PHP获取远程网页内容的函数

PHP获取远程网页内容有多种方式,例如用自带的file_get_contents.fopen等函数. <?php    echo file_get_contents("http://blog.s135.com/abc.php");    ?> 但是,在DNS轮询等负载均衡中,同一域名,可能对应多台服务器,多个IP.假设blog.s135.com被DNS解析到 72.249.146.213.72.249.146.214.72.249.146.215三个IP,用户每次访问blo

PHP 获取远程网页内容的代码(fopen,curl已测)_php实例

1.fopen的使用 复制代码 代码如下: <?php $handle = fopen ("http://s.jb51.net/", "rb"); $contents = ""; while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); echo $contents; //输出获取到得内容. ?> 复制代码 代码如下: // 对 PHP