![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.2ベストアンサー
- 回答日時:
基本方針は回答1の通りでいいと思います。
最終実行時刻の記録は、「ファイルのタイムスタンプ」を使うのが簡単でしょう。
コードにすると、こんな感じ
---
<?php
lock_and_wait("flock.txt");
function lock_and_wait($filename)
{
$fp = fopen($filename, "ab+");
flock($fp, LOCK_EX);
$stat = fstat($fp);
$mtime = $stat[mtime];// タイムスタンプ=最終実行時刻取得
$next_execute_time = $mtime + 5; // 次回実行時刻を計算
$now = time(); // 現在時刻
$wait = $next_execute_time - $now;
if ($wait > 0) { // 現在時刻が次回実行時刻より前の場合
sleep($wait); // 次回実行時刻まで待つ
}
ftruncate($fp, 0); //タイムスタンプ=最終実行時刻を更新
fclose($fp);
}
?>
---
これで、
lock_and_wait("flock.txt");
の関数呼び出しが、
・1人目は、すぐに返ってくる
・2人目は、1人目の関数呼び出しより5秒経ってから返ってくる
という動作になります。
この場合、「1人目の処理を始めてから5秒待つ」って挙動なので、
「1人目の処理が終わってから5秒待つ」にしたい場合は、もう一工夫要ります。
この回答へのお礼
お礼日時:2010/03/07 23:40
処理待ちのコードが大変参考になりました。
if ($limit > $wait > 0) { // 現在時刻が次回実行時刻より前の場合
として$limitを超えた場合エラーとして処理する方針で考えて見ます。
ありがとうございました。
No.3
- 回答日時:
んー、正直、疑問だらけだったので、スルーしてたのですけど、一応、話に加わってみます。
とりあえず、このシステムの利用人数制限は何人なのでしょうか?
二人だけなら5秒待つだけで済みますが、二人目が待っている間に、三人目四人目と来たら、4人目は15秒待つ事になるのでしょうか?
一人目が5秒の間に、再度アクセスした場合はどうなるのでしょうか?
誰かがF5アタックのようなことをした場合、レスポンス待ちの長い行列ができる事になるのでしょうか?
No.1
- 回答日時:
前回実行した日時を見る
if(前回実行した日時よりも5秒以上経過している){
実行する
実行した日時を記録する
}else{
実行しない。
}
でいいんじゃない?
ポイントとなるのは、「実行した日時を記録する」
って部分かな。
実行した日時をどこに記録させるか。
が出来ればあとは簡単かと思います。
手っ取り早く作るならDBに保存するとか。
わざわざこんなことでDB使いたくないのであれば、memcacheなどを使うとか。
まぁ、もっと突き詰めると、ほぼ同時に複数アクセス有った場合の排他をどうするかって問題はでてきますけどね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- PHP PHPのセッション有効期限について 5 2023/06/14 12:40
- 法学 不正アクセス禁止法の扱いについて 4 2022/03/23 18:13
- Windows 10 windows 制限解除のやり方教えて 3 2023/01/02 22:46
- その他(プログラミング・Web制作) Windows上のプログラム。「予め決められた時刻に自分で起動して処理して自分で終了する」って可能? 3 2023/01/04 14:29
- Windows 10 だいたいの能力はどのくらいでしょうか 3 2023/03/05 17:18
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 1 2022/06/18 21:20
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPについて基本的なこと
-
[cakePHP]外部ファイルの実行方法
-
PHPでCGIをするのは
-
PHPのコマンドをnobodyオーナで...
-
Linux:PHPでTELNETによるSMTP...
-
PHPで、C#のプログラムを実行す...
-
ファイルの実行権限について
-
system関数で一部のプログラム...
-
PHP(Windows)でコマンド実行
-
cron は動作しているのですが、...
-
PHP&Mysql&Cronを使って自動...
-
onedrive にexcelファイルをア...
-
CFileDialogの最初のディレクト...
-
透過PNGが透過されない!!
-
フォームで戻った際に入力済み...
-
別ファイルの変数を呼び出した...
-
PHPのif文でその処理を途中で抜...
-
phpの中でphpを書けないか
-
さくらサーバーにて、phpからメ...
-
リンク先を隠す方法はないでし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
PHPからバッチファイルの実行
-
php実行中に実行中のphpファイ...
-
Prompt入力値をphp変数として取...
-
Switch文における、returnとbre...
-
phpからエクセルのマクロを実行...
-
ヒアドキュメントの中で演算子...
-
copy() で属性保存
-
httpdのプロセスが自動で消えな...
-
別サーバのプログラムを起動
-
シェルスクリプトをPHPで動かそ...
-
【PHP】命令は記述順に処理...
-
MySQLでのdeadlockをPHPで検出...
-
Linux:PHPでTELNETによるSMTP...
-
サーバーモジュールとCGIプロセ...
-
ブラウザからexecコマンドを実...
-
phpスクリプトのみで定期実行
-
phpのshell_exec関数の動作に関...
-
PHPからlhaコマンドを使いたい
-
htmlでsubmitで指定したAction...
おすすめ情報