i LAPP (linux, apache, php ve postgresql) ortamı var, ama soru Postgres ya da MySQL üzerinde de oldukça aynıdır.
(. Vb tahminleri, faturalar,) birçok şemalar (app kullanarak her müşteri için bir tane) 1 postgres DB yapılandırılmış bir cms müşteriler, belgeleri ele i geliştirilen app, ve diğer verileri, var; Etrafta 200 şemalar, 15 kişi (ort) tarafından aynı anda kullanılan her biri varsayalım.
EDIT: Her masada last_update adında bir zaman damgası alanı ve zaman damgası satır güncelleme her zaman güncelleştirme bir tetikleyici var.
Durum:
- İnsanlar Foo ve Bar, her belge detayları ile bir formu kullanarak, belgeyi 0001 düzenliyorsunuz.
- Foo örneğin, gönderi bilgilerinizi değiştirin.
- Telefon numaralarını değiştirmek Bar ve belgede bazı öğeler.
- Foo 'Kaydet' düğmesine basın, app db güncelleyin.
- Bar basın eski gönderi detayları ile formunu göndermeyi bar sonra 'Kaydet' düğmesini.
- Veritabanında, Foo değişiklikler kaybolmuş.
Olmasını istediğiniz durum:
- İnsanlar Foo, Bar, John, Mary, Paoul her belge detayları ile bir formu kullanarak, belgeyi 0001 düzenliyorsunuz.
- Foo örneğin, gönderi bilgilerinizi değiştirin.
- Bar ve diğerleri başka bir şey değiştirmek.
- Foo 'Kaydet' düğmesine basın, app db güncelleyin.
- Bar ve diğerleri bir uyarı 'Uyarı olsun! Bu belge, başkası tarafından değişimi t olmuştur. 'Fiili verileri yüklemek için buraya tıklayın.
Bunu yapmak için ajax kullanmak için merak ettik; sadece belge ve son güncellenen, timestamp kimliği ile bir gizli alanını kullanarak, her 5 saniyede başka, uyarı iletişim kutusunu göster, son güncellenen kez aynı olup olmadığını kontrol edin ve hiçbir şey yapmayın.
Yani, sayfa check-son-update.php gibi görünmelidir:
<?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';
}
?>
Ama db bir (veya daha fazla ...) belgeleri açtınız her kullanıcı için her 5 saniyede bir stres sevmiyorum.
Db nuking olmadan So, what can be another efficent çözüm? Strong>
Örneğin ben her bir belge için boş bir txt dosyası oluşturma, dosyaları kullanmak için düşündüm ve her belge, i 'dokunma' de 'son değiştirilme zamanı' güncelleme dosyası güncellendi ... ama bu daha yavaş olacağını tahmin i aynı belgeyi düzenleme çok kullanıcıya sahip olduğunda db ve daha büyük sorunları verir.
Başkası daha iyi bir fikir ya da herhangi bir öneriniz varsa, detaylı olarak tarif edin!
* - - - - - UPDATE - - - - - *
Ben kesinlikle sorgu oldukça hızlı olacak eğer dont check 'son güncelleme damgası' için db vurmak DEĞİL seçilmiş, (ana) veritabanı sunucusu, fullfill o şey onun aşırı artırmak için fikir gibi dont diğer görevleri vardır .
Yani, bu şekilde alma im:
- Every time a document is updated by someone, i must do something to sign the new timestamp outside the db environment, e.g. without asking the db. My ideas are:
- Dosya sistemi: her belge için ben her belge, i 'dokunma' dosyası güncellemesi, belgenin kimliği olarak adlandırılan bir empry txt dosyaları oluşturabilirsiniz. Bu boş binlerce dosya var bekleyen Im.
- APC, php cache: Bu muhtemelen ilk olandan daha esnek bir yol olacak, ama alışkanlık php yürütülmesine kendisi yavaşlatabilir, ya da sunucu belleği tüketmek apc kalıcı veri binlerce ve binlerce tutmak merak im. Bu yolu seçmek için korkuyor im biraz.
- Başka bir db, sqlite veya mysql (daha hızlı ve daha hafif basit db yapılarıyla olduğu) sadece belgeler kimliği ve damgaları depolamak için kullanılır.
- I (dosyaları, apc, alt-db) im ciddiye tüm bu .. uzun yoklama istekleri işlemek için, bir alt etki alanında başka bir web sunucusu (lighttp?) Kullanmayı düşünerek tercih ne olursa olsun yolu.
YET ANOTHER EDIT:
Dosyanın yolu çalışmak olmaz.
APC çözüm olabilir.
DB vurmak sadece mümkün olduğunca hızlı ve hafif olması gerekir (sadece iki sütun document_id ve last_update_timestamp ile) damgaları işlemek için bir tablo oluştururken, çok çözüm olabilir.
Uzun yoklama: statik dosyaları (. Görüntüleri, css, js, vs) yüklemek için apache altında lighttpd kullanarak, ben seçeceğim yolu ve sadece uzun yoklama türü için; Bu özel yoklama için, apache2 yükünü hafifletecek.
Apache Proxy-up lighttpd tüm bu isteği olacaktır.
Şimdi, ben sadece db çözeltisi ve APC çözüm arasında karar vermek zorunda ..
ps: beni zaten yanıtladı kime tüm sayesinde, gerçekten da faydalı olmuştur!