У меня есть среда LAPP (linux, apache, postgresql и php), но вопрос такой же как у Postgres, так и для Mysql.
У меня разработано приложение cms i, которое обрабатывает клиенты, документы (оценки, счета и т.д.) и другие данные, структурированные в 1 постгерской БД со многими схемами (по одному для каждого нашего клиента, использующего приложение); допустим около 200 схем, каждый из которых используется одновременно на 15 человек (avg).
EDIT: у меня есть поле timestamp с именем last_update для каждой таблицы и триггер, который обновляет временную метку каждый раз, когда строка обновляется.
Ситуация такова:
- Люди Foo и Bar редактируют документ 0001, используя форму с каждой информацией о документе.
- Foo измените данные отправки, например.
- Сменить номера телефонов и некоторые элементы в документе.
- Foo нажмите кнопку "Сохранить" , приложение обновит db.
- Нажмите кнопку "Сохранить" после строки, повторно отправив форму со старыми деталями отправки.
- В базе данных изменения Foo были потеряны.
Ситуация, в которой я хочу:
- Люди Foo, Bar, John, Mary, Paoul редактируют документ 0001, используя форму с каждой информацией о документе.
- Foo измените данные отправки, например.
- Бар и другие меняют что-то еще.
- Foo нажмите кнопку "Сохранить" , приложение обновит db.
- Бар и другие получают предупреждение "Предупреждение! этот документ был изменен кем-то другим. Нажмите здесь, чтобы загрузить фактические данные".
Я хотел бы использовать ajax для этого; просто используя скрытое поле с идентификатором документа и последней обновленной меткой времени, каждые 5 секунд проверяют, совпадает ли последнее обновленное время и ничего не делают, иначе покажите диалоговое окно предупреждения.
Итак, страница check-last-update.php должна выглядеть примерно так:
<?php
//[connect to db, postgres or mysql]
$documentId = isset($_POST['document-id']) ? $_POST['document-id'] : 0;
$lastUpdateTime = isset($_POST['last-update-time']) ? $_POST['last-update-time'] : 0;
//in the real life i sanitize the data and use prepared statements;
$qr = pg_query("
SELECT
last_update_time
FROM
documents
WHERE
id = '$documentId'
");
$ray = pg_fetch_assoc($qr);
if($ray['last_update_time'] > $lastUpdateTime){
//someone else updated the document since i opened it!
echo 'reload';
}else{
echo 'ok';
}
?>
Но я не хочу подчеркивать db каждые 5 секунд для каждого пользователя, у которого есть один (или более...) документов.
Итак, что может быть другим эффективным решением без использования db?
Я думал использовать файлы, создавая, например, пустой файл txt для каждого документа, и каждый раз, когда документ обновляется, я также "касаюсь" файла, обновляющего "последнее измененное время"... но я предполагаю, что это будет медленнее, чем db и даст проблемы, когда у меня будет много пользователей, редактирующих один и тот же документ.
Если у кого-то есть лучшая идея или какое-либо предложение, опишите это подробно!
* - - - - - UPDATE - - - - - *
Я определенно выбрал NOT, чтобы не ударить db для проверки "последней отметки времени обновления", не возражаете, если запрос будет довольно быстрым, у (основного) сервера базы данных есть другие задачи для полного заполнения, не нравится идея увеличить его перегрузку для этой вещи.
Итак, im так:
- Каждый раз, когда документ обновляется кем-то, я должен сделать что-то, чтобы подписать новую временную метку вне среды db, например. не спрашивая db. Мои идеи:
- Файловая система: для каждого документа я создаю файлы empry txt, названные как идентификатор документа, каждый раз, когда документ обновляется, я "касаюсь" файла. Я ожидаю, что у вас будут тысячи этих пустых файлов.
- APC, php cache: это, вероятно, будет более гибким, чем первый, но им интересно, сохраняют ли тысячи и тысячи данных навсегда в apc, чтобы замедлить выполнение самого php или использовать память сервера. Я немного боюсь выбирать этот путь.
- Другие db, sqlite или mysql (которые быстрее и легче с простыми структурами db) используются для хранения только идентификаторов документов и временных меток.
ДАЙТЕ ДРУГОЕ ИЗМЕНЕНИЕ:
Файл не работает.
APC может быть решением.
Удар по БД также может быть решением, создающим таблицу для обработки временных меток (только с двумя столбцами, document_id и last_update_timestamp), которые должны быть как можно более быстрыми и легкими.
Длительный опрос: этот способ я выберу, используя lighttpd под apache для загрузки статических файлов (изображения, css, js и т.д.), и только для этого типа долгого опроса; Это облегчит загрузку apache2, специально для опроса.
Apache будет проксировать все эти запросы на lighttpd.
Теперь мне нужно решить только решение db и решение APC.
p.s: спасибо всем, кто уже ответил мне, вы действительно были полезны!