PHP入門 ファイルシステム関数 ファイルを開く(fopen/fclose関数)

スクリプトからテキストファイルに書き込みを行う場合、まずテキストファイルを開く必要があります。

構文:fopen関数

fopen(string $filename, string $mode[, bool $use_include_path = false]):resource
$filenameファイルのパス
$modeオープンモード
$use_include_pathuse_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」(バイナリモード)を利用します。バイナリモードでは、テキストモードのようなデータの変換を行いません。