@Abyss всегда есть надежда, что топикстартер таки услышит и поймет как сделать правильно, либо хотя бы в какую сторону копать ) Это опыт, а не странное желание. Многие требования порождаются желанием заказчика умозрительно решить проблему, без какого-либо практического, а часто и даже теоретического опыта в теме. Потому перевод разговора в русло "давайте не будем думать о том как делать, а остановимся на том что нужно сделать" обычно резко повышает логичность ТЗ. И таки я дал ответ даже в рамках задачи, перечитайте ещё раз.
и всё же дрючить сервак каждую секунду не разумно. Даже если сервак не потухнет. Зачем платить больше? Вешать нодЖСы с монгами - тоже слишком заморочено, ради такой мелочи. Отправлять запросы каждые 5, а лучше 10 сек. И ничего страшного, что пользователь просидел 867 секунд, а за считалось только 860. 7 секунд можно скинуть на чесание студентом гениталий (это со скидкой. там на много больше секунд). А если еще более здраво посмотреть на эту ситуацию, то вся эта затея в корне идиотская. Знания проверяются не так. Но в конце концов - вообще похер. Тебе платят за твоё время и ладно. Хотят купить супер сервак ради отиотских секунд и заплатить кучу денег разрабам - пусть покупают и платят.
могу поспорить, что у этого вуза хостинг какой-нибудь рег.ру. Хрен вы там что сделаете, миллионэры. С подходом "Да я сделаю все что угодно, только дорого" и я сделаю. Тупо вас, "гениев" за 10% найму, будете херачить за хлебушек, никуда не денетесь. Вы в реальности сделайте, а не мечтах своих, где нет серваков выделенных с 50 гигами памяти и кол-во запросов к БД ограничено и декану еще немного спиздить надо, а админом там студент за неуспеваемость хуячит. Смешные вы, "теоретики" капец, слов нет
Ничего ) Как и писал ранее, нахватал кусков из доков ) Но если интересно, то вот: Код (Javascript): const fs = require('fs'); const app = require('http').createServer((req, res) => { fs.readFile(__dirname + '/index.html', function (err, data) { if (err) { res.writeHead(500); return res.end('Error loading index.html'); } res.writeHead(200); res.end(data); }); }); app.listen(8080); const io = require('socket.io')(app); let storage = {}; if (fs.existsSync('storage.json')) { storage = JSON.parse(fs.readFileSync('storage.json')); } let counter = 0; io.on('connection', function (socket) { socket.on('timer', function (data) { counter++; let clientIp = socket.request.connection.remoteAddress; if (storage[clientIp] === undefined) { console.log('New IP:' + clientIp); storage[clientIp] = {last: Date.now(), counter: 0, ip: clientIp}; } let diff = Date.now() - storage[clientIp].last; if (diff < 2000) { storage[clientIp].counter += Date.now() - storage[clientIp].last; } storage[clientIp].last = Date.now(); socket.emit('result', { my: storage[clientIp] }); }); }); setInterval(() => { fs.writeFileSync('storage.json', JSON.stringify(storage)); }, 10000); setInterval(() => { process.stdout.write(counter + "\r"); }, 1000); собсно, говнокодец ещё тот, но таки попробуйте это уронить )
Тест на скорую руку показал: 1. DO, droplet за $5 в месяц, одно ядро, 512 мб оперативки. 2. 1000 соединений, в сумме отправили за минуту ~3500000 сообщений, которые каким-то чудом таки умудрились приняться ) 3. Оперативки ~100Мб, ядро ~90% Такие дела.
Начни традиционно, с чатика. Ну или простой todo, только что бы изменения отображались у всех и сразу ) p.s. если что, дроплет удалил. мы, миллионеры, жуть какие жадные, удавимся за 5 баксов в месяц )
А почему просто не включить таймер при открытии страници а при закрытии записать данные в бд. Даже на том скрепке типо через сетиниервал раз всекунду обновлять перемунну добовлять +1. А когда он закрывает вкладку то отправить ajax запрос. Меня только одно интересует как ты отследишь что страница закрылась или он ушел с этой. Хотя в теории если помозговать то можнт. Типо повесить на каждую ссылку отправку этого запроса. А вот про закрытие вкладки нужно подумать. Незнаю решили или нет все не читал. Так что пробуй
Ну тогда создай сессию и ее увеличивай блин это просто пример реализации. Из за того что ты будешь раз в секунду увеличивать сессию сервер думаю не ляжет. Ну как то так.
Пусть профессор заставит кликать студентов по каждому заголовку абзаца, по мере прочтения, а потом перед закрытием страницы студенты кликают по ссылке <a>Изучил. Можно в туалет?</a> Массивчик с временными итервалами кликов можно отправить на сервер.
1. Авторизовался на сайте 2. В базу пишем посещеные страницы с датой и временем 3. Препод смотрит учетку студента где выводим посещеные курсы, уроки и т.д. с временем прибывания, а именно бэкэндом считаем разницу времени посещения этой страницы и временем посещения следущей (если эта страница курс, урок и т.д.) 4. Если на последнюю страницу курс, урок и т.д. был произведен только вход и не было перехода на следующую то ставим её(го) под (?) или что-нибудь в этом роде. 5. Пркпод просматривает курс, урок и т.д. где видет кто просматривал и какое время присутствовал. Конечно если курс не разбит (пагинация) то большую часть посещеных курсов можно ставить под (?)
У меня такое реализовано так что ajax отправляет каждые 5 секунд запрос на сервер, а там уже фиксируется время первого входа и последнего. Тут же географию определяю при первом посещении. Можешь посмотреть в коде как работает например на странице http://blog.ivru.net/?id=1 (в firefox f12 нажимаешь переходишь на вкладку сеть и смотришь). Если в JS будешь копаться там в этом скрипте ещё реализовано подгрузка любых скриптов динамическим способом по инициативе сервера(то есть изначально скрипты не загружаются, но сервер при очередном запросе может сообщить браузеру какой js файл требуется ещё дозагрузить).
Представь, 3000 пользователей сошлись во времени до долей секунды на ajax-запросе, вопрос: какая нагрузка на сервер? Правильно: 3 секунды при минимальном времени выполнения скрипта на одного пользователя. И дело втом, что следующая секунда еще 2500-3000 пользователей, вопрос: время простоя сервера? Правильно: простоя нет и нагрузка максимальная. Так это при рассмотрении обработки процессов не обращая внимания на память и остальные обработки других процессов. Ajax это хорошо, но не всегда...
Почему допустим нельзя сделать так: Зашел пользователь на твою страницу, сохранилось в бд текущее время, на яваскрипте запускаешь счетчик, а по уходу пользователя (типа расфокус или мышка ушла за пределы), фиксируешь время. --- Добавлено --- Что-то я влез в тему, а до конца и не прочитал все комментарии