ファイルI/O
はじめに ▲
ファイルI/O関連は色々な方法が用意されているが、このページではシンプルな fopen() ~ fclose() の流れと file() について触れる
SplFileObject クラスを使用したファイル操作も便利なので、こちらは別ページにて記載する
fopen ▲
fopen(
string $filename,
string $mode,
bool $use_include_path = false,
?resource $context = null
): resource|false
fopen() は、$filename で指定されたリソースをストリームに結びつける
- $filename
- $filename がローカルのファイルを示す形式である場合、そのファイルへのストリームをオープンする
Windows 環境では、ファイルパスで用いる全てのバックスラッシュをエスケープするかフォワードスラッシュを使用することに注意する
開かれるファイルのパーミッションは PHP からのアクセスを許可している必要がある
他にも open_basedir による制限などにも引っかかっていないか確認すること
他の特殊な指定については参考文献1を参照すること - $mode
- パラメータ mode は、そのストリームに要するアクセス形式を指定する
- $use_include_path
- 1 または true を設定すると、incluede_path にあるファイルの検索も行うことができる
- $context
- ストリームコンテキストリソース(詳細は参考文献2)
- 戻り値
- 成功した場合にファイルポインタリソース、失敗した場合に false を返す
この関数は &filename がディレクトリの場合でも成功することがあるため、is_dir() を使って確認してからファイルを開くようにすると、より安全である
// パスを設定
$filePath = "/home/teppei/file.txt"; // テキストを読み込む
// $filePath = "/home/teppei/image.png"; 画像を読み込む
// $filePath = "http://www.example.com/"; 外部サイトも可
// $filePath = "ftp://username:password@example.com/file.txt"; FTP通信でファイルとってくることも可
if( ! is_dir( $filePath ) )
{
$handle = fopen( $filePath, "r" ); // r は 読み込み
...
}
fgets ▲
fgets(resource $stream, ?int $length = null): string|false
ファイルポインタから1行取得する
- $stream
- fopen() や fsockopen() で正常にオープンされたファイルのファイルポインタ
- $length
- fgets() は length - 1 バイト読みだすか、改行文字を検出するか、EOF に達するかのいずれかが起こった時点で終了する
length が指定されない場合は行末に達するまで読みだす - 戻り値
- stream で指定したファイルポインタから最大 length - 1 バイト読みだして文字列を返す
読みだすデータがもうない場合はfalseを返す
// 1行毎にファイルを読み込む処理
$fp = @fopen( "/tmp/inputfile.txt", "r" ); // この @ はエラー制御演算子
if ( $fp )
{
while ( ( $buffer = fgets( $fp, 4096 ) ) !== false )
{
echo $buffer;
}
// feof() でファイルポインタがファイル終端に達しているかどうか調べる
if ( !feof($fp) ) echo "Error: unexpected fgets() fail\n";
fclose($fp);
}
fread ▲
fread(resource $stream, int $length): string|false
バイナリセーフなファイルの読み込み
- $stream
- fopen() を使用して作成したファイルシステムポインタリソース
- $length
- 最大 $length バイトまで読み込む
- 戻り値
- 読み込んだ文字列を返す。失敗した場合は false を返す
// ファイルの中身を読んで文字列に格納する
$filename = "/usr/local/something.txt";
// バイナリファイルの場合、Windowsはバイナリとテキストファイルの形式が異なるシステムなので mode に 'b'を指定すること.
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
fwrite ▲
fwrite(resource $stream, string $data, ?int $length = null): int|false
バイナリセーフなファイルの書き込み
- $stream
- fopen() を使用して作成したファイルシステムポインタリソース
- $data
- 書き込む文字列
- $length
- $length パラメータが数値の場合、$length バイト数分の書き込みが完了したか、$data が終わりに達したかのいずれか早い方の 事象により書き込みは中止される
- 戻り値
- 書き込んだバイト数を返す。失敗した場合は false を返す
// ファイルへの書き込み
$filename = 'test.txt';
$somecontent = "書き込む内容\n";
// ファイルが存在しかつ書き込み可能かどうか
if ( is_writable( $filename ) ) {
// 追記モードで開く
if ( !$fp = fopen( $filename, 'a' ) ) {
echo "ファイルを開けませんでした ファイル名:{$filename}";
exit;
}
// オープンしたファイルに$somecontentを書き込みます
if ( fwrite( $fp, $somecontent ) === FALSE ) {
echo "ファイルへの書き込みができませんでした ファイル名:{$filename}";
exit;
}
echo "書き込みに成功しました \n 内容:{$somecontent} \n ファイル名:{$filename}";
fclose($fp);
} else {
echo "ファイルが書き込み可能ではありません";
}
fclose ▲
fclose(resource $stream): bool
$stream が指しているファイルをクローズする
- $stream
- fopen() または fsockopen() で正常にオープンされたファイルのファイルポインタ
- 戻り値
- 成功した場合に true を、失敗した場合に false を返す
file ▲
file(string $filename, int $flags = 0, ?resource $context = null): array|false
ファイル全体を読み込んで配列に格納する
ファイルの内容を文字列として返すには file_get_contents() を使用する
- $filename
- ファイルへのパス
- $flags
- 設定可能なフラグについては参考文献7を確認する
- $context
- ストリームコンテキストリソース(詳細は参考文献2)
- 戻り値
- ファイルを配列に入れて返す
配列の各要素はファイルの各行に対応しており、改行記号はついたままとなる
失敗すると false を返す
// ファイルの内容を配列に取り込む
$lines = file( 'http://www.example.com/' );
// 配列をループしてHTMLをHTMLソースとして表示し、行番号をつける
foreach ( $lines as $line_num => $line ) {
echo "Line #{$line_num} : " . htmlspecialchars( $line ) . "
\n";
}
// オプションのパラメータを使う例(トリム)
$trimmed = file( 'somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
目次