在 PHP 中,如果啟用了 allow_url_fopen 選項(xiàng),在大多數(shù)以文件名作為參數(shù)的函數(shù)中,可以使用 HTTP 和 FTP URL。也就代表可以通過(guò) PHP 程序訪問(wèn)遠(yuǎn)程服務(wù)器上的文件,從而實(shí)現(xiàn)文件下載、讀取和處理等功能。同時(shí),在啟用 allow_url_include 選項(xiàng)的情況下,也可以在 include、include_once、require 及 require_once 語(yǔ)句中使用 URL,從而實(shí)現(xiàn)動(dòng)態(tài)加載遠(yuǎn)程 PHP 腳本的功能。
需要注意的是,由于啟用 allow_url_fopen 和 allow_url_include 選項(xiàng)會(huì)導(dǎo)致 PHP 程序能夠訪問(wèn)遠(yuǎn)程服務(wù)器上的文件,因此可能存在一定的安全風(fēng)險(xiǎn)。為了避免潛在的安全問(wèn)題,建議在開發(fā)過(guò)程中僅在必要時(shí)啟用這些選項(xiàng),并且謹(jǐn)慎處理遠(yuǎn)程文件的內(nèi)容。
一、獲取遠(yuǎn)程頁(yè)面標(biāo)題
例如,可以用此打開遠(yuǎn)程 web 服務(wù)器上的文件,解析輸出以獲取所需數(shù)據(jù),然后在數(shù)據(jù)庫(kù)查詢中使用該數(shù)據(jù),或者網(wǎng)站其余部分相同的樣式輸出內(nèi)容。
獲取遠(yuǎn)程頁(yè)面的標(biāo)題示例:
<?php $file = fopen ("http://www.example.com/", "r"); if (!$file) { echo "<p>Unable to open remote file.\n"; exit; } while (!feof ($file)) { $line = fgets ($file, 1024); /* 僅當(dāng)標(biāo)題跟標(biāo)簽在同一行時(shí)才有效 */ if (preg_match ("@\<title\>(.*)\</title\>@i", $line, $out)) { $title = $out[1]; break; } } fclose($file); ?>
也可以在 FTP 服務(wù)器上寫入文件(提供具有正確訪問(wèn)權(quán)限的用戶身份連接)。只能使用此方法創(chuàng)建新文件;如果嘗試覆蓋已存在的文件,則調(diào)用 fopen() 將失敗。
二、保存到遠(yuǎn)程服務(wù)器
要以“anonymous”以外的用戶名連接服務(wù)器,需要指明用戶名(可能還有密碼),例如“ftp://user:password@ftp.example.com/path/to/file”(當(dāng)需要基礎(chǔ)認(rèn)證的 HTTP 協(xié)議訪問(wèn)遠(yuǎn)程文件時(shí)也可以使用相同的語(yǔ)法)。
將數(shù)據(jù)保存到遠(yuǎn)程服務(wù)器示例:
<?php $file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w"); if (!$file) { echo "<p>Unable to open remote file for writing.\n"; exit; } /* 這里寫入數(shù)據(jù)。 */ fwrite ($file, $_SERVER['HTTP_USER_AGENT'] . "\n"); fclose ($file); ?>
注意:或許可以從以上范例中了解到可以使用該技術(shù)寫入遠(yuǎn)程日志文件。但不幸的是,這不起作用,因?yàn)槿绻绻h(yuǎn)程文件已存在,調(diào)用 fopen() 將失敗。