関数flock();について調べてたのですが、
結局、イマイチ使い所がわかりませんでした。
とりあえずCGIを手本として以下のロックを作ってみたのですが、
もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。
↓参考プログラム(echo部は進行を表示するためのもの)
<?php
define ("LOCK_FILE","./lock/lock.txt");
Lock();
Unlock();
//ロック
function Lock(){
if(file_exists(LOCK_FILE)){
if(date(U) - filemtime(LOCK_FILE) > 30){
unlink(LOCK_FILE);
echo("古いロック削除<br>");
}
}
$retry = 5;
while(file_exists(LOCK_FILE)){
if($retry <= 0){
echo ("error<br>");
exit;
}
$retry--;
sleep(1);
}
$lockfile = fopen(LOCK_FILE,"w");
fclose($lockfile);
echo("ロック完了<br>");
}
//アンロック
function UnLock(){
unlink(LOCK_FILE);
echo("ロック解除<br>");
}
?>
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
> ということは、このfilenameにロック用ファイルの、上の例で言うlock.txtを参照させればいいんですね。
> そしてその後、排他ロックとロック解除の間で操作したい対象ファイルを弄ればいいと?
> 特にロック用ファイル中に記述する必要はないって事ですよね。
いいえ、間違っています。
flockはファイルをオープンしたときのファイルポインタを設定します。
つまり、ロック用のファイルを自分で用意する必要はありません。PHP側でロック処理をしてくれます。
参考URL:http://php.s3.to/man/function.flock.html,http:// …
この回答への補足
少し出かけていたので返事が遅れました。
ということは、filenameに対象ファイルを当てはめるわけですか?
しかしそれだと、排他ロックエラーの際に、
データが真っ白になってしまう可能性が出てきますよね。
その場合は、エラー時の対処のif部分で、
再度書き直すのが常套ということになるのでしょうか?
質問ばかりでスミマセン。
No.1
- 回答日時:
flock()は開いたファイルに対して排他制御を行う関数です。
ですので使い方としては、
$fp = fopen(filename,"wt") ;
if ( !flock( $fp, LOCK_EX ) )
{
//エラー処理&ファイルクローズ
return ;
}
//ファイルに対する操作
if ( !flock( $fp, LOCK_UN ) )
{
//エラー処理&ファイルクローズ
return ;
}
fclose($fp) ;
という感じになります。
複数の人がほぼ同時にこの処理が動くページにアクセスしたら、先にアクセスした人がファイルに対してロックをかけてしまうので、後にアクセスした人は最初のflockでfalseが返されてエラー処理が実行されます。
この回答への補足
ということは、このfilenameにロック用ファイルの、上の例で言うlock.txtを参照させればいいんですね。
そしてその後、排他ロックとロック解除の間で操作したい対象ファイルを弄ればいいと?
特にロック用ファイル中に記述する必要はないって事ですよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- Perl perlのflock関数でロックをかけたままopen関数で何度もファイルを開きなおすことはできますか 3 2023/05/01 22:25
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP 画像が表示出来ません。 1 2023/02/02 16:30
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- ノートパソコン chromebookのcaps lockが外れなくなった 5 2022/07/14 19:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字コードが混在するテキスト...
-
readfileによる外部HTMLのCSS
-
PHPのメールフォームから別ペー...
-
Smartyのテンプレート作成方法
-
.phpと.incファイルの違いはな...
-
onedrive にexcelファイルをア...
-
透過PNGが透過されない!!
-
Subversionのリポジトリの削除
-
・オブジェクト指向のメリット...
-
別ファイルの変数を呼び出した...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
-
youtubeに音声のみのmp4ファイ...
-
FTPコマンドでディレクトリごと...
-
VBSの「MsgBox」について
-
CFileDialogの最初のディレクト...
-
拡張子php画像をjpg画像等に変...
-
絶対パス?絶対アドレス?意味...
-
PHP+MySQL SQL文を外部ファイル...
-
HYのAM11:00のラップの部分の歌...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字コードが混在するテキスト...
-
tmpファイルが消えない
-
is_fileでファイルが存在してい...
-
ログイン認証機能には、どんな...
-
Smartyのテンプレート作成方法
-
index.htmと index.phpが二つある
-
アクセスログの様なCGI
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
PHPのif文でその処理を途中で抜...
-
別ファイルの変数を呼び出した...
-
.phpと.incファイルの違いはな...
-
CFileDialogの最初のディレクト...
-
FTPコマンドでディレクトリごと...
-
バッチを用いたフォルダの自動移動
-
・オブジェクト指向のメリット...
-
透過PNGが透過されない!!
-
VBSの「MsgBox」について
-
[php初心者]サイトを見てデータ...
-
「@$変数」の「@の意味は?」
おすすめ情報