程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php fopen 函數不能獲取遠程地址內容

php fopen 函數不能獲取遠程地址內容

編輯:關於PHP編程

fopen函數在php中多半是用於讀寫文件了,但有時也用於獲取遠程服務器的文件,但我們在使用fopen讀取遠程文件時需要開啟allow_url_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"

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved