第 39章リモートファイルの使用

php.ini allow_url_fopen を有効にした場合、 ファイル名をパラメータとする関数の多くで HTTP および FTP のURL を使用することができます。加えて、 include() , include_once() , require() , require_once() 命令でURLを使用することができます。 PHPがサポートしているプロトコルに関する詳細は 付録M を参照してください。

注意: PHP 4.0.3以前のバージョンにおいては、URLラッパーを使用するために、 configureオプション --enable-url-fopen-wrapper を使用してPHPをconfigureを行なう必要があります。

注意: PHP 4.3未満のWindows版PHPは次の関数については リモートファイルアクセスをサポートしてません: include() , include_once() , require() , require_once() , そして 参照LXIII, イメージ関数(image) 拡張によるimagecreatefromXXX関数。

例えば、リモートWebサーバーにファイルをオープンし、データを出力、デー タベースクエリーに使用するか、単にWebサイトのスタイルに合わせて出力 を行うことが可能です。

例 39-1. リモートページのタイトルを得る

<?php
$file
= fopen ( "http://www.php.net/" , "r" );
if (!
$file ) {
  echo
"<p>Unable to open remote file.\n" ;
  exit;
}
while (!
feof ( $file )) {
  
$line = fgets ( $file , 1024 );
  
/* タイトルとタグが同じ行にある場合のみ動作します。 */
  
if ( eregi ( "<title>(.*)</title>" , $line , $out )) {
    
$title = $out [ 1 ];
    break;
  }
}
fclose ( $file );
?>

(正しいアクセス権限を有するユーザとして接続した場合には) FTPサーバにファイルを書き込むこともできます。 この方法では、新規ファイルを作成することのみができます。 既存のファイルを上書きしようとした場合には、 fopen() の処理は失敗します。

'anonymous'以外のユーザーで接続を行う場合、URLの中で 'ftp://user:password@ftp.example.com/path/to/file' のように ユーザー名(そして多分パスワードも)指定する必要があります。 (Basic認証を要求された際にHTTP経由でファイルをアクセスする場合と 同じ種類の構文を使用することができます。)

例 39-2. リモートサーバーにデータを保存する

<?php
$file
= fopen ( "ftp://ftp.example.com/incoming/outputfile" , "w" );
if (!
$file ) {
    echo
"<p>Unable to open remote file for writing.\n" ;
    exit;
}
/* データをここに書きます。 */
fputs ( $file , $_SERVER [ 'HTTP_USER_AGENT' ] . "\n" );
fclose ( $file );
?>

注意: 上の例からリモートログに書きこむためにこの手法を使用することを考えるかも しれません。 しかし残念ながら、リモート上のファイルが既に存在する状態では fopen() をコールすることができないため、 それはできません。 分散ロギングのようなことを行うには、 syslog() の使用を考えてみてください。