fopen函數(shù)在php中多半是用于讀寫文件了,但有時(shí)也用于獲取遠(yuǎn)程服務(wù)器的文件,但我們?cè)谑褂胒open讀取遠(yuǎn)程文件時(shí)需要開(kāi)啟allow_url_fopen才可以哦。
解決過(guò)程,首先排除了DNS的問(wèn)題,因?yàn)槌诉@幾個(gè)函數(shù),其他一切工作正常。雖然是帶域名的URL才有問(wèn)題,但gethostbyname() 這個(gè)函數(shù)卻可以得到正確返回。 然后想到的是php.ini 的配置問(wèn)題——但發(fā)現(xiàn)allow_url_fopen 已經(jīng)打開(kāi)。 之后尋求Google幫忙,有人提及是SELINUX的問(wèn)題。可我壓根沒(méi)有打開(kāi)SELINUX。繼續(xù)Google之,發(fā)現(xiàn)了StackOverflow的這篇,代碼如下:
- $file = fopen('http://www.companysz.com/', 'rb');
- var_dump(stream_get_meta_data($file));
- /*
輸出結(jié)果:
- 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.companysz.com/"
- ["timed_out"]=>
- bool(false)
- ["blocked"]=>
- bool(true)
- ["eof"]=>
- bool(false)
- }*/
要使用fopen、getimagesize或include等函數(shù)打開(kāi)一個(gè)url,需要對(duì)php.ini進(jìn)行設(shè)置,通常設(shè)置allow_url_fopen為on允許fopen url,設(shè)置allow_url_include為on則允許include/require url,但在本地測(cè)試環(huán)境下卻不一定管用
- 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測(cè)試環(huán)境中,這樣設(shè)置以后,fopen可以正常打開(kāi)遠(yuǎn)程地址,但遇到本地的地址卻會(huì)報(bào)錯(cuò),例如代碼如下:
fopen("http://localhost/myfile.php", "r");
就會(huì)在超過(guò)php.ini中設(shè)置的腳本最長(zhǎng)執(zhí)行時(shí)間后報(bào)錯(cuò),告知文件不存在等。這在在線服務(wù)器上是不會(huì)出現(xiàn)的,但如果將localhost替換成127.0.0.1,卻可以正常工作。
從狀況看,問(wèn)題出在DNS解析上,按理說(shuō)localhost已經(jīng)自動(dòng)被映射到127.0.0.1,實(shí)際上訪問(wèn)http://localhost和訪問(wèn)http://127.0.0.1也到達(dá)同一個(gè)地址。
解決的方法就是檢查一下Windows的host文件,通常位于system32目錄下,一個(gè)系統(tǒng)盤是C盤的host路徑如下所示
C:/Windows/System32/drivers/etc/hosts
打開(kāi)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']);
- ?>
運(yùn)行結(jié)果:string(1) "1" string(1) "2"
新聞熱點(diǎn)
疑難解答