ファイルに出力するといってもログを出力するだけならerror_log()を使えば簡単です。
≫ PHPのerror_log関数を使ってログを出力する方法
今回は、データベースに保存するほどでも無いデータをファイルにでも吐き出しておくか!という趣旨のファイル出力です。
他にもバッチで他システムに連携するデータを一時的にファイルに出力しておくなんてこともあるかもしれません。
そんな場合のテキストデータをファイルに出力する方法を紹介します。
改行含むテキストデータをファイルに出力
ファイルの出力には file_put_contents() を使います。
[aside type=”normal”]file_put_contents($出力先, $データ)[/aside]
$出力先は、ファイルの出力先です。絶対パスでも相対パスでもいけます。
$データは、出力するデータです。配列でも大丈夫です。
今回は、配列をJSONに変換してファイルに出力するコードを作ってみました。
// ユーザーデータ(とします)
$ary = array(
array('name' => 'A', 'age' => 28, 'from' => '東京'),
array('name' => 'B', 'age' => 20, 'from' => '大阪'),
array('name' => 'C', 'age' => 23, 'from' => '富山'));
// JSON形式に変換
$users = json_encode($ary, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
// ファイルに出力
file_put_contents("user.json", $users);
このコードを書いたPHPと同じ階層に user.json というファイルが出力されます。
中身は以下のようになりました。
[
{
"name": "A",
"age": 28,
"from": "東京"
},
{
"name": "B",
"age": 20,
"from": "大阪"
},
{
"name": "C",
"age": 23,
"from": "富山"
}
]
普通にJSON形式のデータですね。
出力したファイルをダウンロード
出力したデータをファイルとしてダウンロードすることもできます。
サーバー上に保存しないでダウンロードする場合は file_put_contents() は使いません。
その為には以前書いたファイルをダウンロードする方法の記事を先にみてください。
下のサンプルコード内の「ダウンロードするおまじない」の部分について説明しています。
<?php
// ファイルを指定
$filename = "user.json";
// ダウンロードするおまじない
header('Content-Type: application/force-download');
header('Content-Length: '.filesize($filename));
header('Content-Disposition: attachment; filename="'.$filename.'"');
// ユーザーデータ(とします)
$ary = array(
array('name' => 'A', 'age' => 28, 'from' => '東京'),
array('name' => 'B', 'age' => 20, 'from' => '大阪'),
array('name' => 'C', 'age' => 23, 'from' => '富山'));
// JSON形式に変換
$users = json_encode($ary, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
echo $users;
header情報をダウンロード用にして、JSON形式の文字列に変換したデータをそのままechoするだけです。
この前後とかでHTMLタグとか書いてしまうとHTMLも含まれたデータがダウンロードされてしまいます。
文字コードを指定して出力
サーバーに出力するにしてもダウンロードするにしても、文字コードを指定したい場合があると思います。
文字コードを指定しなければ、上の例だとPHPファイルと同じ文字コードになってしまいます。
PHPファイルはUTF-8だけど、ファイルはShift-JISで出力したい場合は、出力する前に mb_convert_encoding() を使って文字列の文字コードを変換します。
サンプルは以下の通りです。
// ユーザーデータ(とします)
$ary = array(
array('name' => 'A', 'age' => 28, 'from' => '東京'),
array('name' => 'B', 'age' => 20, 'from' => '大阪'),
array('name' => 'C', 'age' => 23, 'from' => '富山'));
// JSON形式に変換
$users = json_encode($ary, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
// shift-jisに変換
$users_sjis = mb_convert_encoding($users, 'shift-jis', 'utf-8');
// ファイルに出力
file_put_contents("user.json", $users_sjis);
これで出力された user.json は Shift-JIS になりました。
ダウンロードする場合も基本は同じで、出力する前に変換するだけです。
まとめ
一般的にPHPでファイル出力をしたいという人は、たぶんfile_put_contents()が解決策ではないでしょうか?
ログのようにずっと追記していく方法もあります。
ダウンロードも使える場面ありそうですね。
僕は実はCSVを出力しようとして「ファイル出力」について調べていたのですが、CSVの場合は専用の簡単な関数がありました。










コメント