Лучший способ создать систему последовательного редактирования документов (одновременно редактировать документ может только один человек) - PullRequest
2 голосов
/ 10 декабря 2010

Много слов ниже, извините, но я хотел хорошо объяснить эту ситуацию:

Я нахожусь в процессе создания системы, которая позволяет любому зарегистрированному пользователю редактировать один документ, но я нене хочу, чтобы несколько пользователей могли редактировать этот документ одновременно.

(Просто для справки, я планирую разместить на своем веб-сайте неограниченное количество этих документов, и пользователи смогут создавать новые документыПо сути, представьте себе Google Docs, но только один пользователь может редактировать документ одновременно.

В настоящее время у меня есть решение JavaScript / AJAX / PHP, которое включает в себя для каждого документа базу данных, хранящуюся в базе данных.переменная, которая содержит идентификатор пользователя, который в данный момент редактирует этот документ.Никакие другие пользователи не могут редактировать документ до тех пор, пока этот пользователь не завершит работу, и документ

Когда пользователь «завершил» редактирование (что означает, что он либо закрыл окно редактирования, либо сохранил свои изменения), документ становится доступнымлюбому другому пользователю еще раз ... или, по крайней мере, должен в теории.Для приложения, которое я разрабатываю, важно, чтобы документ стал доступен как можно скорее.Это не проблема, если пользователь, выполняющий редактирование, сохраняет свои изменения, но проблема, если пользователь закрывает окно редактирования и не сохраняет никаких изменений.

Мои текущие настройки для учета несохраненияслучай, это сделать периодический вызов AJAX на страницу php, которая по сути говорит: «Я все еще редактирую. Дайте мне еще две минуты на редактирование».Итак, если пользователь закроет страницу, документ станет доступен каждому в течение двух минут.Это слишком долго для того, что мне нужно.Мне бы очень хотелось, чтобы это было как можно ближе к реальному времени (хотя задержка <10 секунд не будет ужасной). </p>

Эти документы общедоступны, и их статусы отображаются в виде списка.Когда пользователь загружает страницу «Просмотр доступных документов», мне нужно выполнить запрос, чтобы проверить состояние всех последних документов, которые должны быть показаны, сделать документы с истекшим временем редактирования доступными и отобразить их с текущими доступными.

Почему этот метод плохой: когда тонна пользователей одновременно использует это веб-приложение, в нем СКОЛЬКО слишком много запросов, проверок и обновлений AJAX.

Есть ли лучший способ сделать это?(Надеюсь!)

Другая информация: -Я пытался использовать window.unload (для отправки вызова AJAX на страницу «Я закончил редактирование»), но для ajax не хватает временивызов для выполнения.-Я не думаю, что мой хостинг-провайдер позволил бы использовать постоянные PHP-скрипты (и я также не имею опыта работы с постоянными php-скриптами).-Даже если бы я мог использовать постоянный PHP-скрипт, я был бы обеспокоен соответствующей обработкой, если бы мне пришлось запускать тонну этих скриптов одновременно.(100? 1000? Больше? Я не знаю, сколько вычислительной мощности можно было бы использовать.) - Я не могу запускать задания cron.-Если у меня есть клиенты, которые редактируют AJAX-скрипт «Я все еще редактирую», который запускается каждые 10 секунд, а не каждую минуту, это будет МНОГО вызовов AJAX в секунду, если у меня много пользователей, что приведетк большому количеству доступа к БД, что не было бы замечательно.

Я понимаю, что потребности, которые я здесь представил, вероятно, исключают кучу других хороших потенциальных решений, но мне интересно, может ли кто-нибудь подуматьлюбых других возможных способов сделать это.

Спасибо!

Редактировать: (Добавление соответствующего ответа на комментарий)

К сожалению, это не настоящие файлы.Это своего рода виртуальных составных файлов , которые состоят из отдельных вкладов пользователей.Представьте себе одну страницу, которая вместо единого набора текста представляла собой набор последовательно представленных (сверху вниз) сегментов текста, которые в совокупности составляют полный документ.Каждый отправленный пользователем сегмент является коротким и хранится отдельно в базе данных.--- Странно, я знаю, но полезно и необходимо для этого проекта.

1 Ответ

0 голосов
/ 10 декабря 2010

Если это настоящие файлы, вы можете использовать методику, описанную в этом вопросе .

Затем продолжайте делать то, что вы делаете, закройте файл на них, если не было сделано никаких измененийчерез 2 минуты или в любое другое время, которое вы хотите установить.

Редактировать : Можете ли вы сохранить используемые в данный момент документы в памяти и получить к ним доступ оттуда?Это устранит необходимость в многочисленных вызовах базы данных и будет довольно быстрым.Каждые 30 секунд вы можете запросить сайт для сброса таймера документа (в памяти).Следующий пользователь, имеющий доступ к файлу, может проверить таймер этого документа, и если это> заданное вами время, вы можете предоставить ему доступ.

Очень интересная проблема!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...