状況は次のとおりです。
Web ベースのチケット アプリケーション、複数のユーザーがいます。
発生する可能性のある問題の 1 つ (置き換えようとしている古いバージョンでも発生します) は、user1 がチケットを開いて編集し、保存することです。しかし、彼がそれを編集している間に、user2 もチェックマークを開いて保存しました。user2 が行った変更は、user1 によって失われるか上書きされます。
これを防ぐために、ロック メカニズムを実装しました。それはかなり単純です。
- チケットを開くと、PHP スクリプトは既存のロックをチェックします。
- 見つからない場合は、ドキュメントをロックして開きます。
- JS では
setTimeout()
、XmlHttpRequest を呼び出して 10 分後にチケットのロックを解除します (問題なく動作します)。 unload
ウィンドウ/タブを閉じる/離れるときにチケットのロックを解除するイベントも設定しました
問題はステップ 4 にあります:unload
イベント (& it's friend ) は、これを確実beforeunload
に実装するには十分に機能しません(この機能が重大な意味を持つためには、信頼できる必要があります)。多くのブラウザーは常にそれを起動するとは限りません。起動したいとき(戻るボタンを押す、F5を押す、タブを閉じるなど。これはブラウザによって異なります)
私が思いつくことができる唯一の代替手段は、ページがまだ開いていることを伝えるために php スクリプトを呼び出してsetTimeout()
使用することです。XmlHttpRequest()
この「ハートビート」モニターが失敗した場合、ユーザーがチケットから離れ、ドキュメントのロックを解除したと見なされます。
これは私には恐ろしく非効率的であり、数人のユーザーでもすぐにサーバーへの多くのリクエストにつながります.
これを処理する方法について、より良いアイデアを持っている人はいますか?
IE8+ およびその他の最新のブラウザー (理想的には、Firefox、Webkit、Opera) で動作する必要があります。私は IE6/IE7 を気にしません。私たちの組織はそれらを使用していません)。