Вот ситуация:
У меня есть веб-приложение для заявок, несколько пользователей.
Одна проблема, которая может возникнуть (а действительно возникает в старой версииЯ заменяю) это то, что user1 открывает тикет, редактирует и сохраняет его.Но пока он редактировал его, user2 также открывал и сохранял галочку.Изменения, внесенные пользователем 2, будут потеряны / перезаписаны пользователем 1.
Чтобы предотвратить это, я реализовал механизм блокировки, это довольно просто:
- При открытии заявки PHP-скрипт проверяет наличиеблокирует.
- Если он не находит, он блокирует и открывает документ.
- В JS
setTimeout()
и вызов XmlHttpRequest для разблокирования заявки через 10 минут (работает безo проблемы). - Я также установил событие
unload
, чтобы разблокировать билет при закрытии / удалении от окна / вкладки
Проблема сидитна шаге 4: событие unload
(и его друг beforeunload
) просто не работает достаточно хорошо, чтобы надежно реализовать (чтобы эта функция имела какое-либо серьезное значение, она должна быть надежной)многие браузеры не всегда запускают его, когда я хочу, чтобы он запускался (например, нажатие кнопки назад, нажатие клавиши F5, закрытие вкладки и т. д. Это зависит от браузера)
Единственная альтернатива, которую я могу придуматьиспользует setTimeout()
и XmlHttpRequest()
вызов PHP-скриптаЧтобы сказать это, страница все еще открыта.Если этот монитор «сердцебиения» не работает, мы предполагаем, что пользователь отошел от заявки и разблокировал документ.
Мне это кажется ужасно неэффективным и быстро приводит к многочисленным запросам к серверу даже с несколькими пользователями.
Кто-нибудь получил лучшее представление о том, как с этим справиться?
Он должен работать в IE8 + и других современных браузерах (в идеале, Firefox, Webkit, Opera).Меня не волнует IE6 / IE7, наша организация их не использует).