ファイル

ファイルシステム関数
分類 関数 説明
  fopen ファイルまたはURLをオープンする
fclose オープンされたファイルポインタをクローズする
feof ファイルポインタがファイル終端に達しているかどうか調べる
fseek ファイルポインタを移動する
rewind ファイルポインタの位置を先頭に戻す
fgetc ファイルポインタから1文字取り出す
ftell ファイルの読み書き用ポインタの現在位置を返す
fgets ファイルポインタから1行取得する
fgetss ファイルポインタから1行取り出し、HTMLタグを取り除く
fgetcsv ファイルポインタから行を取得し、CSVフィールドを処理する
fputcsv 行をCSV形式にフォーマットし、ファイルポインタに書き込む
fpassthru ファイルポインタ上に残っているすべてのデータを出力する
fstat オープンしたファイルポインタからファイルに関する情報を取得する
  stat ファイルに関する情報を取得する
  copy ファイルをコピーする
  rename ファイルをリネームする
  unlink ファイルを削除する
  flock 汎用のファイルロックを行う
  file_exists ファイルまたはディレクトリが存在するかどうか調べる
is_readable ファイルが存在し、読み込み可能であるかどうかを知る
バイナリセーフ fread バイナリセーフなファイルの読み込み
fwrite
(fputs)
バイナリセーフなファイル書き込み処理
ファイルの内容 file_get_contents ファイルの内容をすべて文字列に読み込む
file_put_contents 文字列をファイルに書き込む
  file ファイル全体を読み込んで配列に格納する
  readfile ファイルを出力する
リンク link ハードリンクを作成する
linkinfo リンクに関する情報を取得する
lstat ファイルあるいはシンボリックリンクの情報を取得する
シンボリックリンク symlink シンボリックリンクを作成する
is_link ファイルがシンボリックリンクかどうかを調べる
lchown シンボリックリンクの所有者を変更する
lchgrp シンボリックリンクのグループ所有権を変更する
readlink シンボリックリンク先を返す
パス pathinfo ファイルパスに関する情報を返す
realpath 絶対パス名を返す
dirname 親ディレクトリのパスを返す
basename パスの最後にある名前の部分を返す
glob パターンにマッチするパス名を探す
ディレクトリ mkdir ディレクトリを作る
rmdir ディレクトリを削除する
is_dir ファイルがディレクトリかどうかを調べる
グループ filegroup ファイルのグループを取得する
chgrp ファイルのグループを変更する
  chmod ファイルのモードを変更する
umask 現在のumaskを変更する
所有者 fileowner ファイルの所有者を取得する
chown ファイルの所有者を変更する
  clearstatcache ファイルのステータスのキャッシュをクリアする
  disk_free_space
(diskfreespace)
ファイルシステムあるいはディスクパーティション上で利用可能な領域を返す
  disk_total_space ファイルシステムあるいはディスクパーティションの全体サイズを返す
  fflush 出力をファイルにフラッシュする
アクセス/更新時刻 fileatime ファイルの最終アクセス時刻を取得する
filemtime ファイルの更新時刻を取得する
touch ファイルの最終アクセス時刻および最終更新日をセットする
  filectime ファイルのinode変更時刻を取得する
  fileinode ファイルのinodeを取得する
  fileperms ファイルのパーミッションを取得する
  filesize ファイルのサイズを取得する
  filetype ファイルタイプを取得する
  fnmatch ファイル名がパターンにマッチするか調べる
  fscanf フォーマットに基づきファイルからの入力を処理する
  ftruncate ファイルを指定した長さに丸める
  is_executable ファイルが実行可能かどうかを調べる
  is_file 通常ファイルかどうかを調べる
  is_uploaded_file HTTP POSTでアップロードされたファイルかどうかを調べる
  is_writable
(is_writeable)
ファイルが書き込み可能かどうかを調べる
  move_uploaded_file アップロードされたファイルを新しい位置に移動する
  parse_ini_file 設定ファイルをパースする
  parse_ini_string 設定文字列をパースする
  pclose プロセスのファイルポインタをクローズする
  popen プロセスへのファイルポインタをオープンする
  realpath_cache_get realpathキャッシュ・エントリーを取得
  realpath_cache_size realpathキャッシュサイズを取得
  set_file_buffer stream_set_write_bufferのエイリアス
  tempnam 一意なファイル名を生成する
  tmpfile テンポラリファイルを作成する
PHP: ファイルシステム 関数 - Manual

ファイルのオープン

fopen()

resource fopen (
    string $filename, //
    string $mode      // ストリームのアクセス形式
    [, bool $use_include_path = FALSE // TRUEのとき、include_pathの検索が有効となる
    [, resource $context ]]           // コンテキスト
    )
PHP: fopen - Manual

成功するとファイルポインタが、失敗するとFALSEが返されます。

$modeを「w」や「a」とすると、指定のファイルが存在しないときにはファイルが作成されます。しかしそのファイルまでのパスが存在しないときには、failed to open stream: No such file or directoryとして警告が出力されます。

if (file_exists($filename))
{
    $fp = fopen($filename, "r+");
}
else
{
    $fp = fopen($filename, "w");
}

fclose()

bool fclose ( resource $handle )
PHP: fclose - Manual

データの書き込み

ファイル全体の書き込み

file_put_contents

int file_put_contents (
    string $filename ,   // ファイル名
    mixed $data          // 書き込むデータ
    [, int $flags = 0    // オプション
    [, resource $context // コンテキストリソース
    ]] )
PHP: file_put_contents - Manual

$filenameが存在しない場合には作成されます。その$filenameまでのパスが存在しない場合には「failed to open stream: No such file or directory」として処理に失敗します。

書き込むデータは、$data

  • 文字列
  • 配列 (1次元)
  • ストリーム リソース

のいずれかを指定できます。このうち配列は、implode()により空文字で連結された文字列として処理されます。

成功した場合には書き込まれたバイト数が、さもなくばFALSEが返されます。

追記 書き込み

fopen()でファイルを開くとき、モードに「a」か「a+」を指定することにより、ファイルの末尾にデータを書き込めます。

fwrite()

int fwrite (
    resource $handle ,
    string $string
    [, int $length ]
    )
PHP: fwrite - Manual
$str = 'abc';

if( $fp = fopen( $filename, 'a' ) )
{
    if( flock( $fp, LOCK_EX ) )
    {
        fwrite( $fp, $str );
        flock( $fp, LOCK_UN );
    }
    fclose( $fp );
}

データの読み込み

同一のクエリでも異なる結果を返す場合、キャッシュの有効期限を指示するようにします。さもなくばブラウザなどのキャッシュが参照されてしまい、サーバにリクエストされないことがあります。

ファイル全体の読み込み

file_get_contents()

string file_get_contents(
    string $filename                    // ファイル名
    [, bool $use_include_path = FALSE   // インクルードパス
    [, resource $context                // コンテキストリソース
    [, int $offset = -1                 // 読み込み開始オフセット
    [, int $maxlen                      // 読み込み最大バイト数
    ]]]] )
PHP: file_get_contents - Manual

$offset$maxlenを指定すれば、ファイルの一部だけを読み込めます。

たとえば「http://example.com/」から読み込むには、次のようにします。

$contents = file_get_contents( 'http://example.com/' );

なおサーバからデータを読み込むならば、cURLの方がより詳細に通信を制御できます。

参考

fgets()

fgets()では1行分読み込めるため、feof()でファイル終端に達するまでこれをくり返すことでファイル全体を読み込めます。

$url = 'http://example.com/';
$contents = '';

$fp = fopen( $url, 'r' );
if( $fp )
{
    while( !feof( $fp ) )
    {
        $contents .= fgets( $fp );
    }
    fclose( $fp );
}
string fgets ( resource $handle [, int $length ] )
PHP: fgets - Manual
bool feof ( resource $handle )
PHP: feof - Manual

バイナリ データの読み込み

バイナリのデータも文字列と同様に読み込めます。ただしデータは文字列として返されるため、数値として扱うにはord()で、16進の文字列にはbin2hex()で変換します。

$fp = fopen( $filename, 'rb' );
$str = fread( $fp, 1 );

$dec = ord( $str );

ディレクトリ

ディレクトリの作成 mkdir()

bool mkdir (
    string $pathname
    [, int $mode = 0777
    [, bool $recursive = FALSE
    [, resource $context
    ]]] )
PHP: mkdir - Manual
mkdir( 'dir' );
mkdir( 'dir/aaa/bbb', 0705, TRUE );

実行時に「No such file or directory in ***」として失敗するならば、$pathnameまでの親ディレクトリが存在しているか確認します。そのとき$recursiveをTRUEとすると、親ディレクトリも作成されます。

パス

ルートディレクトリ

たとえばHTMLならばhref="/"と記述することで、ローカルでもリモートでもルートディレクトリを示します。しかしPHPにおいては、ローカルではWindows、リモートではLinuxのように異なる環境の場合には、異なる場所を示すことになります。

たとえば、

file_get_contents( '/sample.php' );

とすると、

  • Windows … C:\sample.php
  • Linux … /home/ユーザー名/www/sample.php

のようなパスを読もうとします。これに対処するには、

file_get_contents( $_SERVER[ 'DOCUMENT_ROOT' ].'/sample.php' );

とします。なお$_SERVER[ 'DOCUMENT_ROOT' ]は、dirname( __FILE__ )と記述しても同じです。URIとファイルディレクトリ -- ごく簡単なHTMLの説明 - The Web KANZAKI

または、それぞれの環境でinclude_pathディレクティブで参照するディレクトリを適切に指定しておけば、パスの違いを気にせず済みます。

パスに関する情報の取得 pathinfo()

mixed pathinfo (
    string $path
    [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
PHP: pathinfo - Manual
print_r( pathinfo( 'C:\dir\sample.php' ) );
// Array
// (
//     [dirname] => C:\dir
//     [basename] => sample.php
//     [extension] => php
//     [filename] => sample
// )

print_r( pathinfo( '/home/user/www/dir/sample.php' ) );
// Array
// (
//     [dirname] => /home/user/www/dir
//     [basename] => sample.php
//     [extension] => php
//     [filename] => sample
// )

親ディレクトリのパスの取得 dirname()

string dirname( string $path )
PHP: dirname - Manual
echo( dirname( 'C:\dir\sample.php' ) );
// C:\dir

echo( dirname( '/home/user/www/dir/sample.php' ) );
// /home/user/www/dir

参考

URLの解析

更新日時の取得

ファイル名から

$mtime = filemtime( $filename );
PHP: filemtime - Manual

または、

$stat = stat( $filename );
$mtime = $stat[ 'mtime' ];
PHP: stat - Manual

ファイルポインタから

$stat = fstat( $fp );
$mtime = $stat[ 'mtime' ];
PHP: fstat - Manual

stat()ではなく、fstat()です。

HTTPヘッダの設定

fopen()でファイルを開くときに、任意のHTTPヘッダを指定できます。

$options = array(
    'http'=>array(
        'method'=>'GET',
        'header'=>"User-Agent: Mozilla/5.0\r\n".
            "Accept-language: ja\r\n"
        )
    );

$context = stream_context_create( $options );
$fp = fopen( $url, 'r',  FALSE, $context );

HTTPリクエストのカスタマイズ

User-Agentを指定するだけならば、

ini_set( 'user_agent', 'Mozilla/5.0' );

$fp = fopen( $url, 'r' );

として、設定オプションに値を設定する方法もあります。

プロトコルとラッパー

プロトコル 説明
file:// ローカルファイルシステムへのアクセス
http:// HTTP(s) URLへのアクセス

(HTTPSを利用するには、OpenSSLを有効にする)

ftp:// FTP(s) URLへのアクセス
php:// さまざまな入出力ストリームへのアクセス
zlib:// 圧縮ストリーム
data:// データ (RFC 2397)
glob:// パターンにマッチするパス名の検索
phar:// PHPアーカイブ
ssh2:// Secure Shell 2
rar:// RAR
ogg:// オーディオストリーム
expect:// 対話的プロセスストリーム
PHP: サポートするプロトコル/ラッパー - Manual

php://

php://stdin  
php://stdout  
php://stderr  
php://input 読み込み専用のストリーム。リクエストのbody部から、生のデータを読み込む
php://output 書き込み専用のストリーム。printやechoと同じ方法で、出力バッファへ書き込む
php://fd  
php://memory  
php://temp  
php://filter  
PHP: php:// - Manual
PHPのマニュアルから検索