PHPによるプログラミングを行う際に
と思ったことがあると思います。
様々な処理を行えるようにする際に、データをサーバー上に保管したり、一時的にファイルを作成し他の処理のために使ったりと用途は様々あります。
ここではそのPHPによるファイルの書き込みの解説をします。
目次
ファイル書き込みの方法
PHPのファイルにデータを書き込むことができます。
ここで行うファイルの書き込みとは、サーバーにあるファイルへの書き込み処理の方法です。
ある程度学習をされた方であればわかると思いますが、Webアプリケーションではファイル操作をサーバー上でおこないます。
ファイル操作をする際には、Webアプリは下記のような処理を行うのが一般出来です。
- 書き込みファイルが存在するかどうかをチェックする
- 書き込みファイルを開く
- ファイルにデータを入力する
- ファイルを閉じて保存する
ミニマルでこのような処理を行い、これにプラスアルファ必要な処理を追記します。
ところが、ファイル書き込み処理に関してはfile_put_contentsとfwriteという2つの関数があるので、それぞれ解説していきます。
ファイル書き込み処理の書き方(file_put_contents)
ファイル書き込みの具体的な処理方法を解説します。ファイルへの書き込み処理は「file_put_contents」という関数で行えます。
そして、この関数に必要な引数(ひきすう)に必要な変数を事前の処理で用意します。引数は下記の3つです。
引数 | 説明 |
---|---|
filename | filenameはディレクトリ |
data | 書き込むデータを指定する。文字列や配列を指定できる。 |
flags | フラグ FILE_USE_INCLUDE_PATH :インクルードパスを使用 FILE_APPEND:追記モードで開く LOCK_EX:書き込み中にファイルをロック |
よくある処理通りに記述すると、下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $file = 'filestream.txt'; //ファイル名を指定する //ファイルが存在するかを確認する if(!file_exists($file)){ touch($file); //ファイルが存在しない場合には、新規作成する } $current = file_get_contents($file); //ファイルを開きコンテンツを読み込む $current .= "Sample writting"; //コンテンツに追記する file_put_contents($file,$current); //書き込む |
ファイル書き込み処理の書き方(fwrite)
ファイルへの書き込み方法のもう一つの方法にfwrite関数があります。
そして、この関数に必要な引数(ひきすう)に必要な変数を事前の処理で用意します。引数は下記の3つです。
引数 | 説明 |
---|---|
handle | ファイルポインタ |
string | ファイルへ書き込む文字列 |
length | 書き込むバイト数を指定する。 |
戻り値は成功した場合には、書き込んだバイト数を返します。失敗した場合にはfalseを返します。
第3引数であるlengthを指定すると書き込む長さを指定できます。指定したバイト数までは書き込みをしますが、超える分はファイルへ書き込みません。lengthに指定した長さまでstringが指定されていない場合には全て書き込まれます。
lengthは省略可能です。
コードとして記述すると、下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php $filename = 'filestream.txt'; //ファイル名を指定 $content = 'ファイルに記載されるデータ'; //書き込む内容を指定 //ファイルの存在チェックを行い、なければ作成 if(!file_exists($filename)){ touch($filename); } //ファイルを開く if(!$res = fopen($filename,'a')){ exit; } //ファイルへ書き込む if(!fwrite($res,$content)){ exit; } //ファイルを閉じる fclose($res); |
ファイルによる管理とデータベースによる管理の違い
ファイルを取り扱うにあたり、データベースでの管理方法もあることと、それぞれのメリット・デメリットなどを少し知っておくと理解が深まります。
ファイルによるデータの管理
ファイルによるデータの管理は、プログラムを書いたり設計する場合にはとてもシンプルであることがメリットです。
パソコンのハードやソフトが発達するにつれ、ファイルによるデータの管理には、いくつかの問題点が発生しました。
- データの構造が、扱うプログラムごとに異なる
- 重複したデータを取り扱うことがあり、効率も悪く管理も煩雑
- 複数のファイル間で整合性が保てなくなることがある
ファイルによる管理の場合、ファイルは自由に書くことができます。そのため、どうしてもファイル間のルールやファイルの大きさなど様々な不具合が生じがちです。
とてもシンプルで汎用性が必要ないデータなどは、ファイルで管理しても良い場合があります。しかし、ファイルはどうしてもファイルを操作するプログラムに依存してしまうことが多く、他のプログラムからも利用するとなるとどちらかのプログラムに読み込む処理が必要になります。
データベースによるデータの管理
データベースでの管理は、ファイルによる管理のデメリットはなくとてもデータの管理に向いています。
データベースのメリットは下記の3点です。
- データがアプリケーションや他のデータから独立して管理できる
- 一元管理することができる
- 様々な構造のデータを管理できる
特に、よく利用されるリレーショナルデータベースは、容易に、大量のデータを一元管理できます。SQLなどにより高速にデータを検索し取得することもできファイルによる管理に比べ利用するメリットがとても多く、デメリットはそれほどありません。
スマホやパソコンでネットワークを介さず小さいデータを取り扱う場合は、ファイルによる管理の方が良い場合がありますが。そのた、一般的にはリレーショナルデータベースでの管理の方が基本的には便利です。
関連する他の関数
ファイル操作関数一つだけでは基本的にはファイル操作全てをプログラミングすることができません。下記のような関数も関連がある関数として知っておくと理解が深まります。
下記以外にも数多くの関数がありますが、特に利用頻度の多い関数は下記の通りです
関数 | 説明 |
---|---|
fopen | ファイルやURLを指定してファイルを開く |
flock | ファイルロックを行う |
fclose | ファイルを閉じる |
file_exists | ファイルが存在するかチェック |
file_get_contents | ファイルの内容を読み込む |
fread | ファイルを読み込む |
まとめ
ファイル操作処理は事前準備や後処理などがあるためセットで知っておいた方が良い関数などもあります。
関連する他の関数であげたような関数も調べてみることをお勧めします。
ファイル操作の流れは、実際にパソコンでファイルを操作する手順にかなり近いので、データベースによるデータの管理よりはイメージしやすいです。
この記事が参考になれば幸いです。