PHP でファイルの読み書きをしてみる

15・6年ぶりくらいに PHP を触っている。今回はテキストファイルの読み書きをしてみる。PHP v7.0.33 で確認。

目次

1行ずつ読み込む

まずは1行ずつ読み込む方法。

<?php

// この PHP ファイルから見た相対パスで読み込みたいファイルを指定している
$filePath = './example.txt';

// 読み取り専用で開く
$exampleFile = fopen($filePath, 'r');

// 最終行までループする
while(!feof($exampleFile)) {
  // 1行ずつ出力し、末尾に改行を入れる
  echo fgets($exampleFile) . '<br>';
}

// ファイルを閉じる
fclose($exampleFile);

?>

コマンドラインで実行するには以下のように叩く。

$ php example.php

Apache サーバなどに配置していれば、ブラウザでアクセスすれば良い。

このコードを元に、PHP の基礎も一緒に学んでおく。

こんな感じ。

ファイル全量を一気に読み込む

fgets() はファイルを1行ずつ読み込んでいたが、file_get_contents() という関数を使うと、fopen()fclose() すらせずに、ファイルの全文を一気に取得できる。

<?php
$filePath = './example.txt';
// 全文取得する
$exampleFileContents = file_get_contents($filePath);
// 一気に出力する
echo $exampleFileContents;
?>

コレを使えば、ファイルの1行目に新しい行を追加して保存したりできる。ファイルの保存は file_put_contents() という関数で行える。

<?php

// 読み書きするファイルパス
$filePath = './example.txt';

// 事前にファイルの内容を全量取得しておく
$originalContents = file_get_contents($filePath);

// 1行目に追加したいテキストを用意する
$newText = '新・1行目のテキストです';

// 1行目にテキストを追加する・改行コードも付与する
$newContents = $newText . "\n" . $originalContents;

// 上書き保存する・変数 $result は保存が成功したら true になる
$result = file_put_contents($filePath, $newContents);

?>

こんな感じ。

ファイルのパーミッションについて

CentOS Linux に Apache サーバをインストールすると、デフォルトでは /var/www/html/ 配下に PHP ファイルを置けば、ブラウザでその PHP ファイルにアクセスして処理が行えるようになる。

この時、apache ユーザがテキストファイルを読み書きできないといけないので、

のディレクトリは、chmod 777 でアクセス権を付与しておくと良い。

ブラウザからアクセスされたくないテキストファイルであれば、

みたいなディレクトリを chmod 777 で作っておけば、private/ ディレクトリとその配下のファイルには直接アクセスできなくなる。

ブラウザで PHP にアクセスして、スクリプトが実行され、apache ユーザが作ったファイルは、パーミッション 644 で作られるので、その後も PHP スクリプトからファイルの読み書きができる。

以上

ファイルの読み書きができるようになったので、昔ながらの簡単な掲示板 CGI みたいなのを作ることもできるようになった。