PHPではファイル操作を行うさまざまな関数が用意されています。
この記事では、
・ファイルを読み込む方法
・CSVファイルを読み込む方法
・ファイルに書き込む方法
という基本的な内容から、
・ファイルの内容を全て読み込む方法
・ファイルをダウンロードする方法
・外部ファイルを読み込む方法
・ファイルを削除する方法
などのさまざまなファイルを操作する関数についても解説していきます。
今回はそんなPHPのファイル操作について、わかりやすく解説します!
なお、次の記事ではそもそもPHPとはどんなプログラミング言語なのか、その特徴をできることや将来性も交え詳しく紹介しているので良ければ参考にしてください。
→ PHPとは何かわかりやすく解説!できることや将来性、学習方法も紹介
ファイルの読み込み・書き込み
ここでは、PHPのファイル操作の基本であるファイルの読み込みや書き込み方法について解説します。
ファイルのオープンとクローズ(fopen/fclose)
この章では、fopen関数、fclose関数を使い、ファイルの読み込みや書き込みをしていきます。
■fopen
ファイルの読み込みや書き込みをするためには、fopen関数でファイルをオープンする必要があります。
書き方:
resource fopen(string $ファイル名, string $モード [, use_include_path[, コンテキスト]])
引数:
第一引数には読み込むファイル名を指定します。
第二引数にはモードを指定します。モードは読み込みモード‘r’、書き込みモード‘w’などがあります。
戻り値:
ファイルのオープンに成功した場合はファイルポインタを返します。ファイルポインタとは、ファイルをどこまで読んだか、書いたかを示す場所です。
失敗した場合はFALSEを返します。
■fclose
ファイルをオープンし、処理を行った後はfclose関数を使用してファイルをクローズする必要があります。
書き方:
bool fclose (resource $handle)
引数:
fopen関数で正常にオープンされたファイルのファイルポインタを指定します。
戻り値:
成功した場合にTRUE、失敗した場合にFALSEを返します。
fopen関数とfclose関数の使用例:
<?php //ファイルを開く $fp1 = fopen("php.txt", "r"); $fp2 = fopen("https://www.sejuku.net/", "r"); 〜 // ファイルを閉じる fclose($fp1); fclose($fp2); ?>
ファイルの読み込み(fgets)
ファイルを1行ずつ読み込むには、fgets関数を使用します。
書き方:
string fgets($ファイルポインタ [, レングス])
引数:
第一引数にfopen関数で取得したファイルポインタを指定します。
第二引数には読み込む文字の長さを指定します。指定のない場合は改行まで読み込みます。
戻り値:
読み込んだ文字列を返します。ファイルポインタから読み込むデータがない場合はFALSEを返します。
では、実際にファイルを読み込んで内容を取得してみましょう。読み込むファイルは予め用意しておきます。
読み込むファイル(php.txt):
Samurai Engineer
サンプルプログラム:
<?php // ファイルを読み込みモードで開く $fp = fopen("php.txt", "r"); // ファイルを1行ずつ取得する while ($line = fgets($fp)) { echo "$line<br>"; } // ファイルを閉じる fclose($fp); ?>
実行結果:
Samurai Engineer
サンプルではfopen関数で’r’を指定してファイルの内容を読み込みモードで取得しています。
ファイルポインタの内容を取得するためには、while文でファイルポインタの内容を1行ずつ取得する必要があります。
fgets関数は、読み込むデータがなくなるとFALSEを返すのでwhile文が終了します。
CSVファイルの読み込み(fgetcsv)
CSV(Comma Separated Value)ファイルとは、値をカンマ(,)で区切られた形式のファイルのことを指します。
CSVファイルはデータ形式が単純なため、外部ファイルとしてよく使用されます。
PHPでCSVファイルを1行ずつ読み込むには、fgetcsv関数を使用します。
書き方:
array fgetcsv($ファイルポインタ [, int $length = 0 [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\" ]]]])
引数:
第一引数にはfopen関数で取得したファイルポインタを指定します。
第二引数には行の長さを、第三引数には区切り文字であるデリミタを指定します。
戻り値:
読み込んだ1行を区切り文字で区切り、配列に格納した値を返します。
fgetcsv関数を使用してCSVファイルを読み込むサンプルです。
読み込むファイル(member.csv):
1,tanaka,30 2,hayashi,26 3,suzuki,32
サンプルプログラム:
<?php // CSVファイルを読み込みモードで開く $fp = fopen("member.csv", "r"); // ファイルを1行ずつ取得する while (($line = fgetcsv($fp)) !== FALSE) { // 配列を繰り返す for ($c = 0; $c < count($line); $c++) { echo $line[$c] . ", "; } echo $line[$c] . "<br />"; } // ファイルを閉じる fclose($fp); ?>
実行結果:
1, tanaka, 30, 2, hayashi, 26, 3, suzuki, 32,
fopen関数でファイルポインタを取得し、while文の式でfgetcsv関数を使用して、1行ずつCSVファイルを読みこんでいます。
fgetcsv関数を使用してCSVファイルを読み込む方法や、SplFileObjectクラスを使用した読み込み方法については、以下の記事で詳しく解説しています!
ファイルの書き込み(fwrite)
ファイルに書き込むには、fopen関数で書き込みモード‘w’を指定してファイルを開き、fwrite関数で文字列を書き込みます。
書き方:
int fwrite($ファイルポインタ, $文字列, [, レングス])
引数:
第一引数にファイルポインタを指定し、第二引数に書き込む文字列を指定します。
第三引数が指定された場合は、書き込むバイト数を指定します。
以下にファイルに文字列を書き込む簡単なサンプルを紹介します。
サンプルプログラム:
<?php // ファイルを書き込みモードで開く $fp = fopen("php.txt", "w"); // ファイルに書き込む fwrite($fp, "Samurai Engineer"); // ファイルを閉じる fclose($fp); ?>
実行結果(php.txt):
Samurai Engineer
サンプルでは書き込みモード’w’でファイルを開いています。
fwrite関数でファイルポインタと書き込む文字列を指定して、ファイルに指定した文字列を書き込みます。
ファイルの読み込み、書き込み方法については、以下の記事でも詳しく解説しています!
ファイル操作でエラーが発生した場合
ファイル操作は前述したとおり、fopen関数でファイルを開き、fwriteでファイルの書き込み、fclose関数でファイルを閉じる方法が一連の処理となります。
しかし、場合によってはファイルが読み込めなかったり、書き込みでエラーが発生する場合があります。
そのような場合は、指定したディレクトリにファイルが存在するか、パーミッションが書き込みできる権限になっているか?などを確認しておきましょう。
パーミッションを変更する場合は、以下のように記述します。
$file = chmod(‘php.txt’,666)
chmodの2番目の引数の数値が権限の設定となります。
基本的に666に設定しておけば問題ありませんが、数値表記について詳しく知りたい方は以下のページも参考にしてみてください。
https://lolipop.jp/manual/hp/permission/
ファイルの内容を全て読み込む(file_get_contents)
先述したfgets関数を使用すればファイルの内容を1行ずつ取得できますが、file_get_contents関数を使用すれば、fopenやfcloseを使うことなく簡単にファイルの内容を一括で読み込むことができます。
file_get_contents関数は、以下のように記述します。
書き方:
string file_get_contents (string $パス/ファイル名 [, bool $インクルードパス = false [, $コンテキスト [, int $オフセット値 = 0 [, int $最大バイト数 ]]]]);
引数:
第一引数には読み込むパス/ファイル名を指定します。
第二引数にインクルードパスFILE_USE_INCLUDE_PATHを指定すると、インクルードパスからファイルを探すことができます。
戻り値:
読み込んだデータを返します。失敗した場合はFALSEを返します。
file_get_contents関数を使用し、テキストファイルを全て読み込むサンプルです。
読み込むファイルは、fgets関数で使用した「php.txt」を使用しています。
サンプルプログラム:
<?php $contents = file_get_contents("php.txt"); echo $contents; ?>
実行結果:
Samurai Engineer
ファイルの内容を全て読み込むことができています。
そんなfile_get_contents関数の詳細については、以下の記事で詳しく解説しています!
ファイルのダウンロード
ファイルをダウンロードするには、header関数を使用してHTTPヘッダを送信する必要があります。
HTTPヘッダとは、サーバへのリクエスト時にはどんなブラウザがどういった情報をリクエストしているのか、サーバからのレスポンス時にはどのようなコンテンツを返すのかといった、データ本体とは別にブラウザやデータに関する情報を付加するものです。
ダウンロードするにはレスポンスにHTTPヘッダの情報として、「Content-Type」「Content-Length」「Content-Disposition」の3つの指定する必要があります。
書き方:
header ($ヘッダ文字列[, $同じ名前のヘッダが指定された時に値を置換するかどうか[, $レスポンスコード]])
ファイルをダウンロードする具体的な処理内容については、以下の記事で詳しく解説しています!
外部ファイルを読み込む(include)
外部ファイルを読み込むにはinclude文を使用します。
include文は指定されたファイルを読み込んで、ファイルに記述されているソースコードを実行します。
書き方:
include '外部ファイル名';
外部ファイル名はシングルクォーテーションやダブルクォーテーション、括弧で囲んで指定することができます。
外部ファイルは実行ファイルからの相対パスまたは絶対パス、サーバ上の絶対パスで指定します。
サンプルです。
サンプルプログラム(include1.php):
<?php echo 'include1<br>'; include 'include2.php'; ?>
サンプルプログラム(include2.php):
<?php echo 'include2'; ?>
実行結果(include1.php):
include1 include2
include1.phpでは、「include ‘include2.php’;」でinclude2.phpを読み込んでいます。
include1.phpを実行すると、「include1」の表示後、include2.phpの処理が実行され、「include2」が表示されています。
そんな外部ファイルを読み込む方法の詳細については、以下の記事で詳しく解説しています!
ファイルの削除(unlink)
ファイルを削除するにはunlink関数を使用します。
書き方:
bool unlink (string $ファイル名 [, resource $コンテキスト ])
引数:
第一引数には削除するファイル名を指定します。
第二引数にはコンテキストを指定します。コンテキストの詳細については以下のストリームを参照してください。
http://php.net/manual/ja/book.stream.php
戻り値:
削除が成功するとTRUEを返し、失敗するとFALSEを返します。
unlink関数を使用したサンプルです。
サンプルプログラム:
<?php $file = 'php.txt'; //ファイルを削除する if (unlink($file)){ echo $file.'の削除に成功しました。'; }else{ echo $file.'の削除に失敗しました。'; } ?>
実行結果:
php.txtの削除に失敗しました。
そんなファイルの削除方法については、以下の記事で詳しく解説しています!
まとめ
ここでは、PHPのファイル操作全般について解説しました。
解説した内容をおさらいすると、
- fopen関数はファイルを開く
- fclose関数はファイルを閉じる
- file_get_contents関数でファイルの内容を全て読み込む
- header関数でファイルをダウンロードする
- include関数で外部ファイルの読み込み
- unlink関数でファイルの削除
- is_dir関数でファイル・ディレクトリを調べる
となります。
ファイルを扱う処理はよく使われますので、基本はしっかりと抑えておきましょう。
もしファイル操作で分からないことがあったら、この記事を思い出してくださいね。