PHP入門 ファイルシステム関数 ファイルを開く(fopen/fclose関数)
スクリプトからテキストファイルに書き込みを行う場合、まずテキストファイルを開く必要があります。
構文:fopen関数
fopen(string $filename, string $mode[, bool $use_include_path = false]):resource
$filename | ファイルのパス |
$mode | オープンモード |
$use_include_path | use_include_pathパラメーターを利用するか |
fopen関数は、ファイルのオープンに成功すると、戻り値としてファイルハンドルを返します。ファイルハンドルとは、名前のとおり、そのファイルを操作(handle)するためのキーとなる情報です。resource型に属する値です。今後、ファイルに対する読み書きは、このファイルハンドルに対して行うことになります。ファイルを開く際のモード(オープンモード)には、次のような値を指定できます。
主なオープンモード
モード | 概要 |
---|---|
r | 読み込み専用 |
r+ | 読み込み/書き込み可能 |
w | 書き込み専用(ファイルの内容をクリア、存在しない場合には新規作成) |
w+ | 読み込み/書き込み可能(ファイルの内容をクリア、存在しない場合には新規作成) |
a | 書き込み専用(既存の内容に追記。ファイルが存在しない場合は新規作成) |
a+ | 書き込み専用(既存の内容に追記。ファイルが存在しない場合は新規作成) |
x | 書き込み専用(ファイルが存在する場合はエラー) |
x+ | 読み込み/書き込み可能(ファイルが存在する場合はエラー) |
c | 書き込み専用(存在しない場合は新規作成。存在する場合もクリアしない) |
c+ | 書き込み/読み込み可能(存在しない場合は新規作成。存在する場合もクリアしない) |
b | バイナリモード |
t | テキストモード |
今回のアクセスログのようにデータを積上げ式に記録していきたい場合には、「a」または「a+」を選択する必要があります。
構文:fclose関数
fclose(resource $stream): bool
$stream | ファイルハンドル |
ファイルのクローズはスクリプトの終了時に自動的に行われるので、必ずしも必須というわけではありませんが、使用したものは明示的にクローズしたほうが意図しない不具合が起きづらいです。
バイナリモードとテキストモード
ファイルを扱うようになると、改行文字の扱いと無縁ではいられなくなります。文字エンコーディングにかかわらず、改行文字はプラットフォームによって異なるからです。改行文字が異なると、それぞれの環境でファイルを開いた場合に、表示が崩れることがあります。オープンモード「b」「t」は、Windows環境で、この改行文字の扱いを決めるためのオプションです。他の「r」「w」「a」「x」と異なり、それ単体では利用できず、「rb」「r+b」のように表します。
具体的には「t」(テキストモード)では、書き込む際に「\n」を「\r\n」に変換し、読み込む際には「\r\n」を「\n」に変換します。コードの可搬性を損なうため利用すべきではありません。テキストファイル/バイナリファイルいずれにもかかわらず、オープンモードには「b」(バイナリモード)を利用します。バイナリモードでは、テキストモードのようなデータの変換を行いません。