Fieds_labo1
php-FileIO
最終更新:
fieds_labo1
-
view
php FileIO
ファイルアクセス-通常
1.fopen
- resource fopen ( string $filename , string $mode [, bool $use_include_path [, resource $context ]] )
- モード:r,r+,w,w+,a,a+,x,x+
- 返り値:成功時ファイルポインタリソース、エラー時FALSE。
- エラー/例外:オープンが失敗するとこの関数はFALSEを返し、E_WARNINGレベルのエラーを発行。
- @を使ってwarningを抑制可能
2.fwrite
- int fwrite ( resource $handle , string $string [, int $length ] )
- 返り値:成功時書き込んだバイト数、エラー時FALSE。
- 注意: fopen()を使用して追記モードでオープンしたhandleの場合、fwrite()はアトミック。(一部のプラットフォームにおいてstringがファイルシステムのブロックサイズを超えない場合、そしてローカルファイルシステム上のファイルである場合に限る)。 アトミックであるとは、つまりfwrite()をコールする前にリソースをflock()する必要がない。データの書き込みが中断されることはない。
3.fclose
- bool fclose ( resource $handle )
- 返り値:成功時TRUE、失敗時FALSE。
- fopenで開いたファイルリソースは、スクリプト終了時に自動的に閉じられる。fcloseを明示的に呼び出す必要はない。
4.flock
- bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
- ロック操作:共有LOCK_SH、排他LOCK_EX、解除LOCK_UN、プロセスノンブロックLOCK_NB
- flockの結果プロセスをブロックしたい場合、ブロックフラグTRUE
- 返り値:成功時TRUE、失敗時FALSE。
- ロックの解放には fclose()。(スクリプト終了時自動コール)
- flockは、恣意的にファイルをロックする汎用の手段を提供するものであり、アクセスする全プログラムflockを使用することでロック処理が可能。flockを使用しないプログラムからのアクセスは制御不可。
- 注意: flock()は、Windows 環境下では必ずロックする。
- 注意: flock()は、ファイルポインタを必要とするため、(fopen()へ引数"w"または"w+"を指定して)書き込 みモードでオープンすることにより丸めるファイルにアクセス保護する特別なロックファイルを使用する必要があるかも?===>書き込みファイルを直接ロックせず、別にロック制御用ファイルを用意すること。または、W+を使うこと。
【NGパターン】
$fp=fopen("a.txt","w");
flock($fp,LOCK_EX);
fwrite($fp,"1111");
fclose($fp);
※fopenで中身が空のファイルが作成された後に排他ロック。他プロセスが空ファイルを参照して処理を行う場合がある。
$fp=fopen("a.txt","w");
flock($fp,LOCK_EX);
fwrite($fp,"1111");
fclose($fp);
※fopenで中身が空のファイルが作成された後に排他ロック。他プロセスが空ファイルを参照して処理を行う場合がある。
- 警告:flock()はNFS及び他の多くのネットワークファイルシステムでは動作しない。
- 警告:いくつかのオーペレーティングシステムでflock()はプロセスレベルで実装されている。ISAPIのようなマルチスレッド型のサーバーAPIを使用している場合、同じサーバーインスタンスの並列スレッドで実行されている他のPHPスクリプトに対してファイルを保護する際にflock()を使用することはできない。
- 警告:flock()はFATのような旧式のファイルシステムではサポートされていないため、そのような環境の場合は常にFALSEを返す。(特にWindows98ユーザーにとって常に真)
- CGI版は別プロセスだから使えないってこと?
5.ログファイル出力
- 追記、多少時系列狂っても書き込まれてればOKとする、エラー無視でOK?
$r_fo = @fopen($file_log,'a'); // error skip if($r_fo != false) { $r_fw = @fwrite($r_fo,$wr_str); $r_fc = fclose($r_fo); }