小技プログラミング

PHPで排他制御してファイルに書き込む

PHPで排他制御してファイルに書き込む方法です。

下記サンプルコードは、メソッドOutputFileに対して、文字列もしくは配列とファイルのパスを渡すと、指定したパスのファイルへ渡された文字列を書き込みます。

  • $lines[] = "1行目\r\n";
  • $lines[] = "2行目\r\n";
  • $lines[] = "3行目\r\n";
  • OutputFile($lines,"test.html");
  • function OutputFile($lines,$filePath){
  • if(empty($lines))return false;
  • //ファイルサイズを0にして開きます、無い場合は作成を試みます
  • $fp = fopen($filePath,"w") or exit("Error");
  • if(function_exists('stream_set_write_buffer')){
  • //出力バッファサイズを0にします
  • stream_set_write_buffer($fp, 0);
  • }
  • //ファイルに排他ロックを掛けます
  • flock($fp, LOCK_EX);
  • $lineCount = count($lines);
  • if($lineCount == 1){
  • //文字列をファイルに書き込みます
  • fwrite($fp, $lines);
  • }else{
  • //書き込み文字列に配列が指定された場合は、全要素分書き込みます
  • for($i=0;$i<$lineCount;$i++){
  • fwrite($fp, $lines[$i]);
  • }
  • }
  • //排他ロックを解放
  • flock($fp, LOCK_UN);
  • //ファイルをクローズ
  • fclose($fp);
  • return true;
  • }

上記プログラムの場合、既に同名ファイルが存在した場合、一旦中身を全てクリアしています。
既存の内容を残して追記したい場合は、fopen($filePath,"w")で指定している"w"を"a"に変更してください。

fopenメソッドに関する詳しい情報は下記を参照してください。
http://jp1.php.net/manual/ja/function.fopen.php