phpで例えば決済処理を重複して行わないために、
php
1// 作成するファイル名の指定 2$lock_file = __DIR__ . '/lock.txt'; 3 4// ファイルの存在確認 5if( file_exists($lock_file) ){ 6 echo "多重起動はできません。\n"; 7 // スクリプトを終了する 8 exit(0); 9} 10 11// 多重起動防止用ロックファイル作成 12touch( $lock_file ); 13 14echo "スクリプト開始\n"; 15 16// 何か処理する 17sleep(3); 18 19echo "スクリプト終了\n"; 20 21// ロックファイルの削除 22unlink( $lock_file );
参考ロックファイルコードサンプル
みたいな感じで、ロックファイルを用いることで多重起動を防止する例があると思うのですが、この方法だとファイルの存在確認とファイル作成の間に隙間があるので、バグが生じる可能性があるのかなと思います。(以下みたいに変更して、ターミナル2つ開いて同時に実行すると多重起動できてしまう)
php
1// 作成するファイル名の指定 2$lock_file = __DIR__ . '/lock.txt'; 3 4// ファイルの存在確認 5if( file_exists($lock_file) ){ 6 echo "多重起動はできません。\n"; 7 // スクリプトを終了する 8 exit(0); 9} 10sleep(10); 11 12// 多重起動防止用ロックファイル作成 13touch( $lock_file ); 14 15echo "スクリプト開始\n"; 16 17// 何か処理する 18 19 20echo "スクリプト終了\n"; 21 22// ロックファイルの削除 23unlink( $lock_file );
なのでより厳密には以下のようなコードの方が良いと思うのですが、僕の考えは合っていますでしょうか?(ロックファイルを使わずにセマフォを使うみたいな方法もありますが。)
php
1<?php 2// 作成するディレクトリ名の指定 3$lock_file = __DIR__ . '/lock'; 4 5// ディレクトリの存在確認&作成 6if(! mkdir($lock_file, 0700) ){ 7 echo "多重起動はできません。\n"; 8 // スクリプトを終了する 9 exit(0); 10} 11 12echo "スクリプト開始\n"; 13 14// 何か処理する 15sleep(10); 16 17echo "スクリプト終了\n"; 18 19// ディレクトリの削除 20rmdir( $lock_file );
回答2件
あなたの回答
tips
プレビュー