php fopen 函數不能擷取遠程地址內容_PHP教程

來源:互聯網
上載者:User
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的檔案傳值,可以這樣

代碼如下 複製代碼

在example.inc.php中

代碼如下 複製代碼

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

運行結果

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

http://www.bkjia.com/PHPjc/632063.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632063.htmlTechArticlefopen函數在php中多半是用於讀寫檔案了,但有時也用於擷取遠程伺服器的檔案,但我們在使用fopen讀取遠程檔案時需要開啟allow_url_fopen才可以...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.