PHPでファイルに書き込む2つの方法!

PHP

PHPでファイルに書き込む方法について書いています。
ファイルに書き込みをする時には、下記の2つの方法があります。

・ファイルをfopen関数で開いて書き込む
・file_put_contents関数を使う

file_put_contents関数の方が簡単に書き込みを行うことができるのでオススメです。
この記事で載せているサンプルコードについては、PHPのバージョン8.1.8を使って検証しています。

それでは、確認していきましょう。

fopen/fwrite/fclose関数で書き込む

fopen関数でファイルを開いてから、ファイルに書き込むことができます。
ファイルを開いた後はfwrite関数を使って書き込んで、fclose関数でファイルを閉じて処理を終了します。
例えば、下記のように処理をすることができます。

<?php
$file = fopen("hello.txt", "w");
fwrite($file, "hello, world!!");
fclose($file);

最初にfopen関数を使ってファイルを開いています。
第1引数の「hello.txt」が開くファイルのパスになります。
第2引数の”w”がファイルモードになります。
ファイルモードは開いたファイルをどう処理するか指定する文字になります。

今回は”hello.txt”を上書きモード(“w”)で開いています。
上書きモード(“w”)で開くと、対象ファイルの内容が毎回上書きされます。

$file変数に開いたファイルのファイルポインタリソースを代入しています。
その次の行で、fwrite関数を使って内容を書き込みます。
第1引数は取得したファイルポインタリソース、第2引数に書き込みたい内容です。

これで、”hello.txt”に対して、「hello, world!!」という文字列を上書きします。
最後にfclose関数に、ファイルポインタリソースを渡して処理を終了します。

上記のプログラムを実行すると、「hello.txt」ファイルがない場合は新規作成されます。(ある場合は上書き)
そして、「hello, world!!」を上書きして処理を終了します。

fwrite関数とfputs関数の違い

fwrite関数の代わりに、fputs関数を使って書き込むこともできます。

<?php
$file = fopen("hello.txt", "w");
fputs($file, "hello, world!!");
fclose($file);

先ほどのプログラムのfwrite関数をfputs関数に変えてみました。
これでも同じように動作します。

fputs関数は、fwrite関数のエイリアスなので機能に違いはありません。
公式のこちらのドキュメントにエイリアスであることが明記されています。

その他のファイルモード(上書き/追記/新規書き込み)について

書き込むときのファイルモードをまとめてみました。

モード 内容
w 上書き書き込みモード。ファイルがない場合には作成して、毎回ファイルを上書きする。
a 追記書き込みモード。ファイルがない場合には作成して、追記で書き込みをする。既に書かれている内容は消えない。
x 新規書き込みモード。ファイルがある場合にはエラーになる。ファイルがない場合のみ新規でファイルを作成して書き込みを行う。

よく使うのは、上書きするための「w」と、現状のファイル内容に追記していく「a」になるかと思います。
「x」を使った場合に、既にファイルがある場合には下記のようにFatal errorが発生します。

Fatal error: Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in /Users/xxx/writeFile.php

公式のfopen関数の記事にまとめられているので参照してみてください。

改行したいとき

改行したい時には、改行コード(“\n”)を書き込む内容に含めるようにします。
例えば、下記のように改行することができます。

<?php
$file = fopen("hello.txt", "w");
fwrite($file, "hello, world!!\nhello, world!!\nhello, world!!");
fclose($file);

まず、fopen関数で、「hello.txt」ファイルを上書きモード(“w”)で開いています。
そして、fwrite関数に渡している書き込む内容に改行コード(“\n”)を含めて改行しています。

このように、ダブルクォーテーションで囲んだ文字列に改行コードを含めることで、任意の場所で改行されて出力されます。
シングルクォーテーションで囲んだ場合には改行コードが効かないので注意してください。

実際に出力したファイルを確認すると、このようになります。

hello, world!!
hello, world!!
hello, world!!

改行コードの箇所で、改行されたことが確認できました。

配列の内容を書き込みたい

配列の内容を書き込みたい場合は、foreach関数でループして出力すると良いです。
例えば、下記のようにして書き込むことができます。

<?php
$texts = ["こんにちは", "今日は晴れています", "さようなら"];

$file = fopen("hello.txt", "w");
foreach($texts as $text) {
    fwrite($file, "{$text}\n");
}
fclose($file);

最初に文字列の配列として、$texts変数を作成しました。
その後にfopen関数で、書き込みたいファイルを上書きモードで開いて、$file変数にファイルポインタリソースを取得しています。

そして、foreach文で配列の内容がある間ループして、書き込み処理を行なっています。
ループの中でしている処理は、fwrite関数でファイルに書き込んでいます。
最後にfclose関数でファイルを閉じて、処理を終了しています。

ファイルを参照すると、下記のように配列の内容が書き込まれているのが確認できました。

こんにちは
今日は晴れています
さようなら

file_put_contents関数で書き込む

file_put_contents関数を使うことで、簡単にファイルに書き込むことができます。
公式ドキュメントのこちらに書いていますが、fopen関数・fwrite関数・fclose関数を続けて使って、ファイルに書き込むのと同じとのことです。

例えば、下記のように使うことができます。

<?php
file_put_contents("hello.txt", "hello, world!!!");

上記の1行で、file_put_contents関数を使って、ファイルに文字列を書き込んでいます。
第1引数に書き込みたいファイルを指定して、第2引数に書き込みたい文字列を指定します。

今回は「hello.txt」ファイルに「hello, world!!!」文字列を書き込みました。
ファイルがない場合は作成されて内容が書き込まれます。

file_put_contents関数では、何も指定がない場合には上書きモードで書き込まれます。

追記モードで書きたい

file_put_contents関数を使って、追記モードで書き込みたいときには第3引数を使います。
下記のように第3引数を指定して、実行すると追記モードで書き込まれます。

file_put_contents("hello.txt", "hello, world!!!", FILE_APPEND);

第3引数にはフラグを指定します。
今回はFILE_APPENDを指定しているので、追記されるようになりました。

他に指定できるフラグは?

第3引数に指定できるフラグは3つあります。

フラグ 内容
FILE_USE_INCLUDE_PATH 第1引数のファイルパスをインクルードディレクトリから探す。
FILE_APPEND 第1引数のファイルパスが既に存在する場合に、第2引数の内容を追記する。
LOCK_EX 書き込み処理中に、ファイルの排他ロックを確保する。

FILE_APPENDとLOCK_EXがよく使われそうです。
排他ロックをすることで、ファイルに書き込み終わるまでは、他のユーザーは書き込めなくなります。

複数のフラグを一緒に使いたいときには、論理演算子(|)を使って、下記のように指定します。

file_put_contents("hello.txt", "hello, world!!!", FILE_APPEND | LOCK_EX);

書き込みデータに配列を指定できる

file_put_contents関数では書き込むデータに配列を指定することもできます。
例えば、下記のように指定することが可能です。

file_put_contents("hello.txt", ["apple\n", "grape\n", 'banana']);

第2引数に配列を指定しています。
このようにすると、第2引数の配列の内容が、ひとつずつファイルに書き込まれます。
今回のように指定した場合には、下記のように書き込まれます。

apple
grape
banana

引数と戻り値まとめ

file_put_contents関数の引数と戻り値をまとめてみます。

引数

file_put_contents関数に指定できる引数です。

・第1引数:必須の引数。データを書き込み先のファイルパス。
・第2引数:必須の引数。書き込むデータを指定する、文字列と配列とストリームリソースを指定することができる。
・第3引数:フラグを指定して、書き込むときの挙動を変えることができる。
・第4引数:コンテキストリソースを指定することが可能

戻り値

file_put_contents関数はファイルに書き込まれたバイト数を返してくれます。
書き込みに失敗した場合にはfalseが返ってきます。

おわりに

今回はPHPでファイルに書き込むための2つの方法について紹介しました。

基本的にはfile_put_contents関数を使った方が、fclose関数での閉じ忘れなどが発生しないのでいいのではないかなと思います。
ループなどで処理した内容を出力したい場合には、文字列として変数に出力内容を保持しておいて、最後にfile_put_contents関数で書き込むと良いです。

コメント

タイトルとURLをコピーしました