PHP でファイルの読み書きをしてみる
15・6年ぶりくらいに PHP を触っている。今回はテキストファイルの読み書きをしてみる。PHP v7.0.33 で確認。
目次
1行ずつ読み込む
まずは1行ずつ読み込む方法。
example.php
<?php
// この PHP ファイルから見た相対パスで読み込みたいファイルを指定している
$filePath = './example.txt';
// 読み取り専用で開く
$exampleFile = fopen($filePath, 'r');
// 最終行までループする
while(!feof($exampleFile)) {
// 1行ずつ出力し、末尾に改行を入れる
echo fgets($exampleFile) . '<br>';
}
// ファイルを閉じる
fclose($exampleFile);
?>
コマンドラインで実行するには以下のように叩く。
$ php example.php
Apache サーバなどに配置していれば、ブラウザでアクセスすれば良い。
このコードを元に、PHP の基礎も一緒に学んでおく。
- PHP ファイルは
<?php
と?>
で囲んだ部分が PHP コードと解釈され、その外側に書かれたモノはそのまま出力される。だから HTML コードと混在できる<?php
・?>
を書かなかった PHP ファイルをphp
コマンドで実行してみると、コードがそのまま出力されることからも、その動作が確認できる
- 変数は
$変数名
と宣言する - 文字列はシングルクォートかダブルクォートで囲んで使用する。Bash や Perl と同様に、ダブルクォートで囲むと変数や特殊文字 (
\n
とか\t
とか) などを展開してくれる - ファイルを開くには
fopen()
関数を使う。第2引数で'r'
と指定すれば Read-only、読取専用となる - 開きたいファイルは、その PHP ファイルを起点とした相対パスでも、絶対パスでも良い。ただし、PHP の実行プロセス (Apache など) がそのファイルを読み書きできるようパーミッション設定がなされていること
while
ループ。feof()
関数で最終行に到達しているかどうかが分かるfgets()
関数で1行取り出すecho
は厳密には関数ではないので、カッコを付けずに書ける。echo('HOGE');
と書いても動きはする- 文字列と変数などを結合して表示するには、ピリオド
.
を使う。Java や JavaScript だとプラス+
で結合しているところ - PHP における改行は、コマンドラインで実行していれば1行ずつ
echo
していれば改行されるが、ブラウザで表示する場合は HTML として解釈されるので、br
要素を使うなどして改行を表現する必要がある fclose()
関数でファイルを閉じる
こんな感じ。
ファイル全量を一気に読み込む
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
ユーザがテキストファイルを読み書きできないといけないので、
/var/
/var/www/
/var/www/html/
/var/www/cgi-bin/
(ついでに)
のディレクトリは、chmod 777
でアクセス権を付与しておくと良い。
ブラウザからアクセスされたくないテキストファイルであれば、
/var/www/private/
みたいなディレクトリを chmod 777
で作っておけば、private/
ディレクトリとその配下のファイルには直接アクセスできなくなる。
ブラウザで PHP にアクセスして、スクリプトが実行され、apache
ユーザが作ったファイルは、パーミッション 644
で作られるので、その後も PHP スクリプトからファイルの読み書きができる。
以上
ファイルの読み書きができるようになったので、昔ながらの簡単な掲示板 CGI みたいなのを作ることもできるようになった。