PHPのfwrite関数はファイルに文字列を書き出す処理で使われる関数です。しかし、fwrite関数を使うにはストリームが必要で、さらにそのストリームを閉じる処理も必要です。そのためPHPのプログラムでファイルに書き出す処理は、なんだか難しそうと思われるかもしれません。
今回はそのような方に、PHPでファイルを書き出すfwrite関数の基本について例を用いて解説します。
目次
PHPでファイルに出力する手順
PHPを含む多くのプログラム言語には、プログラムの処理で作成したデータをファイルに書き出す機能が用意されています。そして今回説明するfwrite関数もその1つです。
しかし、プログラムでファイルに書き出す処理は簡単ではありません。fwrite関数を使うなら、正しい手順で書き出す処理を作る必要があります。まずは、PHPでファイルに出力する手順とその注意点について解説します。
ストリームを開く
PHPのプログラムの処理でデータをファイルに書き出す方法は幾つかあります。その中でもよく使われる方法が、ストリームを使う方法です。そして今回紹介するfwrite関数もストリームを利用します。
なお、ストリームとは、ファイルにアクセスするための仮想的なインターフェースで、ファイルからデータを読み出したり書き込むために使います。ストリームはfopen関数で作成するので、ストリーム生成方法についてはfopen関数のマニュアル等を参照してください。
なおストリームに関しては、こちらの記事も参照してください。
ファイルストリームって何?PHPのfopenについて機能と使い方を解説ファイルに書き出すモードは2つ
fwriteでストリームに対して書き出す際、ファイルの先頭から書き出すモードと、ファイルの末尾以降に書き出すモードの2つから選べ、どちらもfopenで設定できます。
ファイルの先頭から書き出す場合、既にあるファイルに対して書き込むとそのファイルを一旦0バイトにし、新しいデータを上書きします。またファイルが無い場合は新規に作成を試みます。
一方ファイルの末尾以降に書き出す場合は、既にあるファイルをそのまま残した状態でそのファイルに新しいデータを追記します。またこのモードもファイルが無い場合は新規に作成を試みます。
なお、どちらのモードでストリームを作成したとしても、プログラムで作成したデータをファイルに書き出す際、fwrite関数を利用できます。
ストリームを閉じる
先ほどのfopen関数でストリームを作ったら、fclose関数でそれを閉じる処理が必要です。そのためfwrite関数を使ってデータをファイルに書き出す処理を作る場合、fopen関数とfclose関数をセットで使用してください。
fwrite関数を使った簡単な例
1 2 3 |
$fp = fopen($file_name, "w"); fwrite($fp, $data); fclose($fp); |
fwrite関数の基本
fwrite関数は先ほど説明したストリームを利用してプログラムの処理で作成したデータをファイルに書き出すための関数です。ではfwrite関数をどのように使うといいでしょうか。
fwrite関数の使い方を知りたい方のために、次からfwrite関数の基本について解説します。
fwritw関数の文法
fwrite関数は、引数にストリームとファイルに書き出すデータを指定すると、データをストリームを通じてデータをファイルに書き出します。さらに書き込むデータの制限値をバイト数で指定することも可能です。その場合、書き込むデータを全て書き出したか、制限値に達した段階で書き込みが終了します。
そして、fwriteは書き込みに成功した場合は書き込みしたバイト数を返します。また、エラーが発生した場合に返す値はfalseです。
fwrite関数の文法
fopen( ストリーム, ファイルに書き込むデータ );
または
fopen( ストリーム, ファイルに書き込むデータ, 制限値 );
fwrite関数を利用するメリット
PHPの関数にはバイナリーセーフな関数とそうでない関数とがありますが、fwrite関数はバイナリーセーフな関数です。そのためファイルに書き出すデータに文字列以外のデータが含まれていても安全に書き出せます。
このバイナリーセーフとは、アルファベットや数字。記号に割り当てられた文字コード以外の文字コードを含むデータを処理しても誤動作しないことを意味します。そのためfwrite関数は、文字列でないデータの書き出しにも利用できます。
また、fwrite関数の書き込み処理は途中で中断されたりしません。例えば、WebサーバーにPHPのfwrite関数でログファイルを作成する仕組みを作った場合、ほぼ同時にファイルに追記するケースが発生します。
しかし、fwrite関数を使用することで、書き込み処理中にファイルが自動でロックされることから、同時に1つのファイルに書き込みされることはありません。
fwrite関数の例
fwrite関数はストリームを対象にして、文字列やデータなどをファイルに書き込みます。そのためにはまずストリームを作成し、次にfwrite関数を使用し、最後にfclose関数で閉じる処理が必要です。
fwrite関数の使用例
1 2 3 4 5 6 7 8 |
<?php $fp = fopen($file_name, "w"); foreach( $datas as $line ) { $str = $line . "\n"; fwrite($fp, $str); } fclose($fp); ?> |
これは配列の$datasに格納された文字列を、$file_nameで指定されたファイルに書き込む例です。そしてforeach文の繰り返し処理の中で、fwrite関数を使用しています。
fwrite関数によるファイル出力の書き方
PHPでファイルにデータを書き込む処理を作成する場合、書き込みに失敗した場合の処理を作っておかないと、処理の途中で突然サービスが停止してしまうこともあります。このような場合に備えて、利用者にトラブルを通知するためにエラー処理を作成しなければなりません。
そこでfwrite関数を利用する場合のエラー処理の考え方について解説します。
ファイルの有無のチェック
fwrite関数を使うためにfopen関数でストリームを作る必要がありますが、fopenが必ず成功するとは限りません。まずはfopenに成功した場合にのみ、fwrite関数を実行するように作ってください。
なお、fopen関数はストリームの作成に成功したらファイルポインタを返し、失敗した場合はfalseを返します。ストリームがfalseの場合のみ、fwrite関数を実行するようにプログラムを記述してください。
ストリームチェックを追加したfwrite関数の使用例
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $fp = fopen($file_name, "w"); if( $fp !== false ) { foreach( $datas as $line ) { $str = $line . "\n"; fwrite($fp, $str); } } else { echo "fopen関数でエラーが発生しました\n"; } fclose($fp); ?> |
なお、PHPにはファイルが書き込み可能かどうかを調べるis_writable関数が用意されています。事前にこの関数でファイルに書き込みできるかチェックしてから、feopnとfwriteでファイルに書き出すプログラムを書くことも可能です。
書き込み中のエラー処理
fwrite関数には戻り値があり、書き込みに成功した場合は書き込んだバイト数を、一方書き込み中にエラーが発生した場合はfalseを返します。
もし、書き込み途中にエラーが発生した場合、fwrite関数の戻り値をチェックしてシステム管理者に問い合わせするようになメッセージを表示するプログラムを作れることが可能です。
fwrite関数のエラーチェックを追加したfwrite関数の使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $fw_err = 0; $fp = fopen($file_name, "w"); if( $fp !== false ) { foreach( $datas as $line ) { $str = $line . "\n"; if( fwrite($fp, $str) === false ) { $fw_err = 2; break; } } } else { $fw_err = 1; } fclose($fp); if( $fw_err != 0 ) { echo "ファイルへの書き込みでエラーが発生しました\n"; } ?> |
try~catchによるエラー処理
PHPはtry~catchによるエラー処理も記述できます。先ほどの例では、変数$fw_errの値でエラーメッセージを表示しましたが、fwrite関数を含む処理を関数に登録してthrowを利用すると、try~catchによるエラー処理を記述可能です。
具体的には、fopen関数とfwrite関数の戻り値がfalseだったら、throwでエラー処理を発生させ、try~catchでエラー内容を表示します。次にtry~catchを利用したfwrite関数のエラー処理の例を紹介します。
try~catchを利用したfwrite関数の例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php try { file_write($file_name, $datas) { } catch (Exception $e) { echo $e->getMessage() . "\n"; } function file_write($file_name, $datas) { $fp = fopen($file_name, "w"); if( $fp === false ) { throw new Exception("fopenでエラーが発生しました"); } foreach( $datas as $line ) { $str = $line . "\n"; if( fwrite($fp, $str) === false ) { throw new Exception("fwriteでエラーが発生しました"); } } fclose($fp); } |
まとめ
これまで解説したようにfwrite関数は書き込むファイルをストリームで指定し、さらに書き込むデータを記述してファイルにデータを書き込みます。そのため、fwrite関数はfopen関数、およびfclose関数とをセットで利用するのが基本です。
さらにfwrite関数を利用したファイル書き込み処理ではエラー処理が必要です。そしてPHPのtry~catch処理の中にfwrite関数も記述できます。ぜひ、うまくエラー処理の中にfwrite関数を組み込んだファイル書き込みプログラムを作成してください。
PHPによるCSVファイルの読み込み手順を解説