fopen函數在php中多半是用于讀寫文件了,但有時也用于獲取遠程服務器的文件,但我們在使用fopen讀取遠程文件時需要開啟allow_url_fopen才可以哦。
解決過程,首先排除了DNS的問題,因為除了這幾個函數,其他一切工作正常。雖然是帶域名的URL才有問題,但gethostbyname() 這個函數卻可以得到正確返回。 然后想到的是php.ini 的配置問題——但發現allow_url_fopen 已經打開。 之后尋求Google幫忙,有人提及是SELINUX的問題??晌覊焊鶝]有打開SELINUX。繼續Google之,發現了StackOverflow的這篇,代碼如下:
- $file = fopen('http://www.49028c.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.49028c.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可以正常打開遠程地址,但遇到本地的地址卻會報錯,例如代碼如下:
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"
新聞熱點
疑難解答