章 19. 使用遠程文件

只要在 php.ini 文件中啟動了 allow_url_fopen 選項,您可以在大多數需要用文件名作為參數的函式中使用 HTTP 和 FTP URL 來代替文件名。同時,您也可以在 include()include_once()require()require_once() 語句中使用 URL。PHP 所支援協議的更多訊息參見 附錄 I

註: 要在 PHP 4.0.3 及其以後版本中使用 URL,您需要用 --enable-url-fopen-wrapper 參數來配置 PHP。

註: Windows 版本的 PHP 4.3 版之前不支援以下函式的遠程連接:include()include_once()require()require_once() 以及 參考 XLI, Image functions 擴展庫中的 imagecreatefromXXX 函式。

例如,您可以用以下範例來打開遠程 WEB 伺服器上的文件,解析您需要的輸出資料,然後將這些資料用在資料庫的檢索中,或者簡單地將其輸出到您網站剩下內容的樣式匹配中。

例子 19-1. 獲取遠程文件的標題

<?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);
    /* This only works if the title and its tags are on one line */
    if (eregi ("<title>(.*)</title>", $line, $out)) {
        $title = $out[1];
        break;
    }
}
fclose($file);
?>

如果您用有合法的連接權限,以一個用戶的身份和某 FTP 伺服器建立了鏈接,您還可以向該 FTP 伺服器端的文件進行寫操作。您僅能用該方法來創建新的文件;如果您嘗試覆蓋已經存在的文件,fopen() 函式的呼叫將會失敗。

要以“anonymous”以外的用戶名連接伺服器,您需要指明用戶名(甚至密碼),例如“ftp://user:password@ftp.example.com/path/to/file”。(如果通過 HTTP 協議連接遠程文件時需要基本身份認証,您也可以用使用的語法。)

例子 19-2. 遠程伺服端的資料存儲

<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
    echo "<p>Unable to open remote file for writing.\n";
    exit;
}
/* Write the data here. */
fputs ($file, $_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>

註: 您或許可以從以上範例中得到啟發,用該技術來存儲遠程日志文件。但是正如以上提到的,在用 fopen() 方式打開的 URL 中,您僅能對新文件進行寫操作。如果遠程文件已經存在 fopen() 函式的操作將會失敗。要進行類似的分布式日志操作,您可以參考 syslog() 函式。