タイトルにはファイルが記載されていますが、ファイルである必要はありません。どんなロック機構でもかまいません。
状況は次のとおりです。Cで記述されたデーモンプロセスと、phpで記述されたWebページがあります。特定の状況下でCデーモンがファイルをロックし、phpが状況を検出して、システムがビジーであることをクライアント側に通知するように、相互ロックする方法が必要です。
これを行う簡単な方法はありますか?
ありがとう、
タイトルにはファイルが記載されていますが、ファイルである必要はありません。どんなロック機構でもかまいません。
状況は次のとおりです。Cで記述されたデーモンプロセスと、phpで記述されたWebページがあります。特定の状況下でCデーモンがファイルをロックし、phpが状況を検出して、システムがビジーであることをクライアント側に通知するように、相互ロックする方法が必要です。
これを行う簡単な方法はありますか?
ありがとう、
flock
適切に行います。
PHP スクリプトで、ノンブロッキング ロックを使用します。
$fd = fopen('/var/run/lock.file', 'r+');
if (!flock($fd, LOCK_SH | LOCK_NB, $wouldblock) && $wouldblock) {
// buzy
}
LOCK_NB フラグは、この呼び出しをブロックしないようにします。ファイルが排他的にロックされている場合は、すぐに戻ります。複数のページで同時にファイルをロックできます。
でロックを解除できます
flock($fd, LOCK_UN);
C デーモンで、ブロッキングおよび排他ロックを使用します。
flock(fd, LOCK_EX); // This will wait until no page has locked the file
PHP のflock()
ドキュメントと Cのドキュメントを参照してください。
ビジー状態のときにデーモンにファイルを作成させ、そうでないときにそれを削除してから、PHP で次のようにすることができます。
if (file_exists('/path/to/file')) {
echo 'System busy';
}
PHP アプリケーションがデータベース駆動型の場合、そのデータベースの特定の列を簡単に更新して、「システムがビジー状態」であることを示す必要があります。
cronjob はこのフラグを設定およびリセットし、PHP アプリケーションはその値を読み取ることができます。
デーモンがビジーであることを PHP だけに検出させたいですか? それとも、実際にお互いに待ってもらいたいですか?排他的ロックを使用すると、C デーモンがロックを取得して続行する前に、すべての PHP インスタンスが作業を完了するのを待たなければならないという欠点があります。
C デーモンがビジーであること (つまり、一方向のみ) を検出するだけの場合は、ビジー トークン ファイル (またはセマフォ、または共有メモリ オブジェクト - プラットフォームに依存) の存在をテストするだけの方が良いオプションかもしれません。 . ただし、ファイルの作成は、共有メモリに単純なフラグを設定するよりもコストがかかる傾向があります。