ファイルにはいろんな読み書きの方法があります。よく活用する1行ずつの読み書きにはfputs(書く)、fgets(読む)で可能です。
また、ファイルを読み書きする前にはそのファイルをfopen(開く)し、読み書きした後にfclose(閉じる)ことが必要です。
ファイル操作の流れ
①ファイルを開いて…fopen
②書く、または読む…fputsまたはfgets
③ファイルを閉じる…fclose
例:
<?php //hh(XX時)をファイル名にする $filename = date("H") . ".txt"; //追加書き込みモードで開く(ファイルが無いときは作成) $fh = @fopen($filename, "a"); if(!$fh){ //メッセージを出してスクリプトの終了 exit("ファイル書き込みのオープンに失敗しました"); //die()関数はexit()関数のエイリアス //die("ファイル書き込みのオープンに失敗しました"); } else{ //排他ロック flock($fh,LOCK_EX); //乱数を保存 $msg = date("Y/m/d H:i:s") . " ==> "; $msg .= rand(1,9999) . "\n"; //書き出し fputs($fh,$msg); //ロックを解除 flock($fh,LOCK_UN); //ファイルを閉じる fclose($fh); } ?>
fopen(ファイル名,ファイルモード)
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
@はエラー制御演算子で、式の前につけるとその式でのエラーメッセージを無視します。
モード | 意味 |
r | 読み込みのみでオープン |
r+ | 読み込み/書き出し用にオープン |
w | 書き出しのみでオープン(ファイルがない場合は作成) |
w+ | 読み込み/書き出し用でオープン(ファイルがない場合は作成) |
a | 追加書き出しのみでオープン(ファイルがない場合は作成) |
a+ | 読み込み/追加書き出し用でオープン(ファイルがない場合は作成) |
flock(ファイルハンドル,ロック方法)
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
ロック定数 | 数値 | 意味 | 説明 |
LOCK_SH | 1 | 共有ロック | 解放されるまで他の書き込みはNG、読み込みはOK |
LOCK_EX | 2 | 排他ロック | 解放されるまで他の書き込みも、読み込みもNG |
LOCK_UN | 3 | ロック解除 | 解放 |
LOCK_NB | 4 | ロック中 | ブロックモードとしない |
ファイルを開く処理などで下記のように記述されていることがあります。
$fh = @fopen("test.txt","w") or die("ファイルのオープンに失敗しました");
@はfopenでエラーが起きてもエラーは無視され、エラーメッセージは表示されませんという意味です。
そしてorはファイルオープンが正常にできなかったらその後の処理、ここでは「ファイルオープンに失敗しました」と表示してdieでプログラムを終了します。
これはorの論理演算式です。最初にファイルオープンを実行し、これが成功(TRUE)だったら、orが成立するので(どちらかが真)後ろのdieは実行されず、無視されるというカラクリの方程式です。
文字列(1文字ずつ) = fgets(ファイルハンドル)
string fgets ( resource $handle [, int $length ] )
例:
<?php //ファイルの書き込み //hh(XX時)をファイル名にする $filename = date("H") . ".txt"; //追加書き込みモードで開く(ファイルが無いときは作成) $fh = @fopen($filename, "a"); if(!$fh){ //メッセージを出してスクリプトの終了 exit("ファイル書き込みのオープンに失敗しました"); //die()関数はexit()関数のエイリアス //die("ファイル書き込みのオープンに失敗しました"); } else{ //排他ロック flock($fh,LOCK_EX); //乱数を保存 $msg = date("Y/m/d H:i:s") . " ==> "; $msg .= rand(1,9999) . "\n"; //書き出し fputs($fh,$msg); //ロックを解除 flock($fh,LOCK_UN); //ファイルを閉じる fclose($fh); } //ファイルの読み込み if(file_exists($filename)){ $fh = @fopen($filename, "r"); if(!$fh){ exit("ファイル読み込みのオープンで失敗しました"); } else{ while(!feof($fh)){ //一行ずつ(改行文字まで)読み込む $temp = fgets($fh); //内容を出力 if($temp > ""){ echo str_replace("\n","<br>",$temp); } } //ファイルを閉じる fclose($fh); } } ?>
配列(行) = file(ファイル名)
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
例:
<?php //ファイルの書き込み //hh(XX時)をファイル名にする $filename = date("H") . ".txt"; //追加書き込みモードで開く(ファイルが無いときは作成) $fh = @fopen($filename, "a"); if(!$fh){ //メッセージを出してスクリプトの終了 exit("ファイル書き込みのオープンに失敗しました"); //die()関数はexit()関数のエイリアス //die("ファイル書き込みのオープンに失敗しました"); } else{ //排他ロック flock($fh,LOCK_EX); //乱数を保存 $msg = date("Y/m/d H:i:s") . " ==> "; $msg .= rand(1,9999) . "\n"; //書き出し fputs($fh,$msg); //ロックを解除 flock($fh,LOCK_UN); //ファイルを閉じる fclose($fh); } //ファイルの読み込み if(file_exists($filename)){ //ファイルを一行ずつ配列に格納する $temp = file($filename); //内容を出力 foreach($temp as $num => $line){ if($line>""){ echo str_replace("\n","<br>",$line); } } } ?>
ファイルの内容 = file_get_contents(ファイルハンドル)
string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
例:
<?php //ファイルの書き込み //hh(XX時)をファイル名にする $filename = date("H") . ".txt"; //追加書き込みモードで開く(ファイルが無いときは作成) $fh = @fopen($filename, "a"); if(!$fh){ //メッセージを出してスクリプトの終了 exit("ファイル書き込みのオープンに失敗しました"); //die()関数はexit()関数のエイリアス //die("ファイル書き込みのオープンに失敗しました"); } else{ //排他ロック flock($fh,LOCK_EX); //乱数を保存 $msg = date("Y/m/d H:i:s") . " ==> "; $msg .= rand(1,9999) . "\n"; //書き出し fputs($fh,$msg); //ロックを解除 flock($fh,LOCK_UN); //ファイルを閉じる fclose($fh); } //ファイルの読み込み if(file_exists($filename)){ //すべての内容を一つの文字列に取り込む $temp = file_get_contents($filename); //内容を出力 if($temp > ""){ echo str_replace("\n","<br>",$temp); } } ?>