こんにちは。明月です。
I/OとはInput/Outoutという意味ですが、プログラムでI/Oというとファイル入出力という意味になります。
プログラムを作成してみればPropertyという環境ファイルを読み取りする時もあるし、クライアントにファイルを転送するために読み込む時もあります。
逆にプログラム上でログやデータをデータベースではなく、ファイルで格納するしブラウザからファイルをアップロードされ、ファイルを書き込む時もあります。
<?php
$contents = "";
try {
// ファイルがない場合、Warningのメッセージが発生するので、「@」によってFalseが発生して実行されない。
// fopenはファイルのコネクションを生成する。
if(@$handle = fopen('data.txt', 'r')) {
// ファイルコネクションでファイルを読み取る。
$contents = fread($handle, filesize('data.txt'));
}
} catch(Exception $e) {
print_r($e);
} finally{
// I/Oリソースは必ずcloseをしなければならない。
@fclose($handle);
}
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
<?=$contents?>
</body>
</html>
そして同じフォルダにある「data.txt」ファイルを読み取ります。
ここで「data.txt」ファイルには改行がありますが、ウェブページには一行目で表示されます。参考にウェブブラウザは改行が「<br />」タグなので、バイナリの「\r\n」や「\n」はブラウザで改行されません。
fopenはファイルコネクションを生成してファイルを開いてfreadでファイルを読み取りします。
最後にfcloseで必ずリソースを返却しなければならないです。そうではなければプログラム上でI/Oリソースをずっと使用中になるので、他のセッションで使えなくなります。
PHPはスクリプトなのでrequest&response単位でリソースを自動に返却しますが、プログラムパフォーマンスのため、使用が終わったらすぐリソースを返却しましょう。
今回はファイルを書き込みしましょう。
<?php
$data = "";
// request方式がPOSTの場合、
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$data = $_POST["data"];
try {
// ファイルがある場合、fopenからhandleを受け取ってfwriteが実行される。
if (@$handle = fopen('data.txt', 'a')) {
fwrite($handle, $data . "\r\n");
}
} catch (Exception $e) {
print_r($e);
} finally{
// I/Oリソースは必ずcloseをしなければならない。
@fclose($handle);
}
}
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
<!-- submitボタンを押下するとPOSTタイプにrequestする。 -->
<form method="POST">
<input type="text" name="data" value="<?=$data?>">
<input type="submit">
</form>
</body>
</html>
初めにファイルを読み取る時にはfopen関数でパラメータを「r」を使いました。また、書き込む時には「a」を使いました。
上のパラメータはファイルのコネクションのタイプを選べることです。
モード | 説明 |
---|---|
r | 読み取り専用。ポインタは最初です。 |
r+ | 読み取り + 書き込み。ポインタは最初です。 |
w | 書き込み専用。 ファイルは初期化になります。ファイルが存在しないなら作成します。 |
w+ | 読み取り + 書き込み。ファイルは初期化します。ファイルが存在しないなら作成します。 |
a | 書き込み専用。ポインタは最終です。 |
a+ | 読み取り + 書き込み。ポインタは最終です。 |
x | 書き込み専用。ポインタは最初です。ファイルが存在するとエラーが発生します。 |
x+ | 読み取り + 書き込み。「x」と同じモードです。 |
c | 書き込み専用。ポインタは最初です。このモードで作成した内容は書き直しではなく、文字列が追加する。(テストの結果は書き直すけど。。。) |
c+ | 読み取り + 書き込み。「c」と同じモードです。 |
e | 開いているデスクリプタで「close-on-exec」フラグを設定しべきです。POSIX.1-2008互換性のあるシステムでコンパイルされたPHPでのみ使用することができます。 |
マニュアルをみれば、様々なモードオプションがありますね。でも、筆者は「r,w,a」しか使わないので実は他の機能はよくしりません。
「+」表示があるので、読み取り、書き込みを同時に使えますが、筆者の考えは良くないです。特に「r+」で作成したらポインタが最初になるので内容が追加されることではなく、書き直しになります。
仕様によってポインタを移動して書き直しすることもあると思いますが、ほとんど予想されない結果になります。
そのため、簡単に読み取りは「r」、新しく書き込むは「w」、既存ファイルから内容を追加は「a」を使う方がシンプルで使いやすいです。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// ファイルをアップロードしたらnameとtmp_name(任意ファイル)のパスがある。
$name = $_FILES["data"]["name"];
$path = $_FILES["data"]["tmp_name"];
try {
// 任意ファイルからバイナリ形式でデータを読み取る。
if (@$handle = fopen($path, 'rb')) {
$binary = fread($handle, filesize($path));
}
} catch (Exception $e) {
print_r($e);
} finally{
@fclose($handle);
}
try {
// バイナリ形式のデータをファイルに書き込む。
if (@$handle = fopen($name, 'wb')) {
fwrite($handle, $binary);
}
} catch (Exception $e) {
print_r($e);
} finally{
@fclose($handle);
}
}
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="data">
<input type="submit">
</form>
</body>
</html>
上の例はブラウザからファイルをアップロードしたら格納するソースです。ここにはモードオプションで「b」が付けています。
「b」という意味はバイナリですが、ファイルからバイナリを読み取ってバイナリまま書き込みすることです。
ファイルアップロードができました。参考に実際のプログラミングする時にアップロードしたファイルをそのままサーバに書き込むのはセキュリティとして危ないです。
「.php」ファイルをアップロードしてそのphpファイルにサーバ情報などが出力するようにするとハッキングの危険性があるのでです。
その後、アップロードファイルがバイナリではなく、ただのテキストファイルならバイナリタイプではなく、テキストタイプでも問題ないです。
link - https://www.php.net/manual/en/function.fread.php
- [PHP] PHPのコーディング領域とデザイン領域を分離するテンプレートライブラリ Smarty2020/02/02 03:00:00
- [PHP] Reflection - Variable編2020/02/01 03:00:00
- [PHP] Reflection - Method編2020/01/31 03:00:00
- [PHP] Reflection - Class編2020/01/30 03:00:00
- [PHP] エラーページ処理方法(追加: ob_cleanとdie関数使用方法)2020/01/29 03:00:00
- [PHP] 分散設定ファイル(.htaccess) 使用方法2020/01/28 03:00:00
- [PHP] データベース(mariaDB)を連結して使う方法2020/01/24 03:00:00
- [PHP] IOに関して2020/01/23 03:00:00
- [PHP] requireとinclude、そして「@」の使用方法2020/01/22 03:00:00
- [PHP] Fatal及びNotice,、Warningメッセージ処理する方法2020/01/19 03:00:00
- [PHP] xDebug設定する方法2020/01/18 03:00:00
- [PHP] $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())2020/01/17 03:00:00
- [PHP] データ確認関数(var_dump, debug_zval_dump, print_r)2020/01/16 03:00:00
- [PHP] 例外処理(try ~ catch ~ finally)2020/01/15 03:00:00
- [PHP] 配列とリスト(list)2020/01/14 03:00:00
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07