Сергей Добросклонов
|
|
« : 29-11-2010 21:51 » |
|
На странице есть код, который ставит всем пользователям статус "не в сети", если пользователь не проявлял активности определённое время. Но это очень сильно будет нагружать сервер. Я знаю, что по этой причине умные люди делают скрипт, который запускается через заданное количество времени. Что-то слышал про какой-то крон... Но что-то точно понять что это вообще не смог. Где-то вычитал, мол крон только на Линуксе, а на Виндовсе что-то другое используется... Помогите разобраться с этим вопросом.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 29-11-2010 22:11 » |
|
Интересно, а сколько у тебя пользователей в онлайне одновременно могут находится. Что простой запрос к одной таблице базы данных на удаление слишком накладно? Уточни точно, какая ОС тебя все таки интересует?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #2 : 29-11-2010 22:43 » |
|
Барин, я бы еще попросил не глотать фразы. Определенно есть ощущение, что больше половины сказанного не попало в текст.
Как всегда предлагаю плясать от печки. Т.е. он требуемого результата. И перечислить входные условия.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
baldr
|
|
« Ответ #3 : 30-11-2010 07:54 » |
|
Барин, почему ты думаешь, что это будет нагружать сервер? В простейшем случае это делается одним SQL-запросом и вполне может быть включено в код странички, на мой взгляд. Вместо cron на Windows используется чаще всего штатный Task Scheduler, но если можно сделать без него - лучше сделать без него
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Сергей Добросклонов
|
|
« Ответ #4 : 30-11-2010 10:37 » |
|
RXL, я перечитал текст и не нашёл, ни одной обрубленной фразы... А вот твоя фраза меня вынесла: больше половины сказанного не попало в текст. Как сказанное не попало в текст, если оно уже сказанное? Или вот это: Т.е. он требуемого результата.
Кто он? RXL, не думай, что мне захотелось устроить барагоз, я человек мирный, но просто я заметил, что большинство пользователей по существу отвечают, а ты всегда начинаешь с каких-то колкостей. Но в этот раз я реально не понял сути первой фразы... Надеюсь, к этому возвращаться больше не будем. Попытаюсь подробнее объяснить ситуацию. Сервер к меня на Виндовсе, пока, что просто локальный. Допустим, у меня миллион пользователей. На каждой странице моего сайта есть блок вот с таким кодом: $new_timestamp=time(); $set_offline=mysql_query("UPDATE users SET status='offline', timestamp='0', online_time='0' WHERE status='online' AND (timestamp + $timeoutseconds)<$new_timestamp",$db);
Я не знаю как будет поживать база, если при каждом переходе на другую страницу каждого пользователя будет выполняться этот запрос. Думаю, это накладно. Поэтому я хочу убрать этот код со страницы и "повесить" обязанность пересчёта пользователя на сервер, который будет только через заданные промежутки времени выполнять эти операции. Если же это для базы пустяки, я буду только рад и оставлю всё как есть. Надеюсь, сейчас всё понятно изложил.
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #5 : 30-11-2010 10:41 » |
|
Барин, о понятии, сессия, что нибудь слышал?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Sla
|
|
« Ответ #6 : 30-11-2010 11:02 » |
|
На странице есть код, который ставит всем пользователям статус "не в сети", если пользователь не проявлял активности определённое время. Но это очень сильно будет нагружать сервер. Я знаю, что по этой причине умные люди делают скрипт, который запускается через заданное количество времени. Что-то слышал про какой-то крон... Но что-то точно понять что это вообще не смог. Где-то вычитал, мол крон только на Линуксе, а на Виндовсе что-то другое используется... Помогите разобраться с этим вопросом.
На странице есть код, который ставит всем пользователям статус "не в сети", если пользователь не проявлял активности определённое время.
На странице нет такого кода, такой код - в серверном скрипте. Но это очень сильно будет нагружать сервер.
Откуда дровишки? Я знаю, что по этой причине умные люди делают скрипт, который запускается через заданное количество времени.
Если можно, то ссылку на умных людей. Вроде мы и сами не дураки Что-то слышал про какой-то крон... Но что-то точно понять что это вообще не смог. Где-то вычитал, мол крон только на Линуксе, а на Виндовсе что-то другое используется...
Про крон написано так много, что это не просто ГДЕ-ТО. И вообще про Планировщики очень много написано
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Сергей Добросклонов
|
|
« Ответ #7 : 30-11-2010 11:34 » |
|
Барин, о понятии, сессия, что нибудь слышал? Слышал, использую. На странице нет такого кода, такой код - в серверном скрипте. index.php - это разве не страница? Если можно, то ссылку на умных людей. Вроде мы и сами не дураки Ссылки нет, просто при поиске ответов натыкался на такую информацию Откуда дровишки? Если я ошибаюсь, просто исправьте меня. Если это не так, то я только рад буду и не стану ничего переделывать
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #8 : 30-11-2010 11:43 » |
|
index.php - это разве не страница?
Не страница, а серверный скрипт, который "отдает" страницу.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
McZim
|
|
« Ответ #9 : 30-11-2010 12:00 » |
|
Слышал, использую.
Ну так и зачем тогда тебе при каждом переходе на соседние страницы "лазить" в базу? Проверяй сессию, после того как она "умерла" (отключился пользователь или тайм-аут или еще что то), обновляй базу, выставляй значение не в сети.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
|
|
« Ответ #10 : 30-11-2010 12:38 » |
|
Барин, колкости? Тебе показалось. А предложение писать внятно было. Давай я тебе процитирую твой пост с разбором по смысловым частями, как это видно со стороны, и увидишь, почему я считаю, что тут много проглоченных фраз. На странице есть код, который ставит всем пользователям статус "не в сети", если пользователь не проявлял активности определённое время. "Код на странице" - что ты под этим имел в виду? Код на клиентской стороне или на серверной? "ставит всем пользователям статус" - это, наверно, какая-то индикация статусов пользователей на странице? Как видишь, приходится домысливать, что ты имел в виду. Но это очень сильно будет нагружать сервер. Что - "это"? Опять домысливаю: вероятно, таки у тебя программа на серверной стороне. А вот почему оно должно нагружать сервер? Ты же ничего о методике определения статуса не написал. Я знаю, что по этой причине умные люди делают скрипт, который запускается через заданное количество времени. Без объяснений, зачем это надо и как это считаешь, переходишь к планировщику по времени. Что-то слышал про какой-то крон... Но что-то точно понять что это вообще не смог. Где-то вычитал, мол крон только на Линуксе, а на Виндовсе что-то другое используется... Помогите разобраться с этим вопросом. Ну, это уже можно связать с предыдущим предложением. Т.ч. никаких колкостей, а чистая телепатия. Вот если бы ты объяснял не обрывки мыслей, а саму задачу (как я написал выше - плясать надо от печки), то было бы проще понять и интереснее объяснять.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #11 : 30-11-2010 12:49 » |
|
"миллион пользователей" - это оптимистично. Хорошо бы хоть тысячу для начала. И из них за минуту запросят какую-нибудь страницу лишь несколько процентов. Статусы рекомендую хранить в отдельной странице, а не с профилями пользователей. И не хранить по записи на каджого, а в ней должны быть только "онлайн". Задача сводится к работе с небольшой табличкой: удалению не обращавшихся на сервер некоторое время и в добавлении новых. CREATE TABLE online_users ( user_id INT NOT NULL, last_activity DATETIME, PRIMARY KEY (user_id) ); Для очень неплохой посещаемости в сотню за последнюю минуту можно даже не делать индекса по last_activity. INSERT INTO online_users (user_id, last_activity) VALUES ($user_id, NOW()) ON DUPLICATE KEY UPDATE SET last_activity = NOW(); При запросе очередной страницы вставляем новую строку или обновляем в ней дату, если такая строка уже есть. DELETE FROM online_users WHERE last_activity < NOW() - INTERVAL 15 MINUTE; Удаляем устаревшие записи.
|
|
« Последнее редактирование: 30-11-2010 12:55 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Сергей Добросклонов
|
|
« Ответ #12 : 30-11-2010 13:09 » |
|
RXL, вот написал же нормальный ответ и как-то всё понял. Просто мой вывод по жизни, чем больше человек программист, тем больше он целяется к словам. Конечно, мне было бы не плохо знать какие-то вещи, но то что index.php - это не страница, а серверный скрипт, который "отдает" страницу это существенно никогда бы не подумал. Итак ясно, что php выплняет сервер... А теперь к теме. Я понял твой совет, интересная тема, но мне надо будет ещё поразбираться, чтобы понять как это будет работать. Миллион это я так, для примера. Мне вот просто интересно, всё таки с этим миллионом и с тем что статус у меня хранится у каждого пользователя отдельно и у меня на серверном скрипте каждой страницы (на каждой php странице) есть код: $new_timestamp=time(); $set_offline=mysql_query("UPDATE users SET status='offline', timestamp='0', online_time='0' WHERE status='online' AND (timestamp +
Это существенная нагрузка на сервер или нет?
|
|
« Последнее редактирование: 30-11-2010 13:11 от Барин »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #13 : 30-11-2010 14:16 » |
|
Барин, понимаешь, чтобы догадаться (не понять!) нужно время, которого мало. Т.к. проблема твоя, то задача по объяснению сути и должна быть на тебе.
Цепляться к словам - есть такое. Потому, что важны все детали: ты думаешь одно, говоришь другое, я понимаю третье, а в итоге - ничего хорошего, т.к., чаще всего, знающий ответ пройдет мимо.
Существенная. Но все относительно. Если там будет десяток-другой юзеров, то пофиг. Представь себе базу в тысячу юзеров. Активны за период были 10. При каждом запросе страницы (не только от юзеров, но и от гостей - иначе информация будет врать) у тебя сканируются 1000 строк. А могли бы сканироваться 10, что в 100 раз быстрее. Индексы с UPDATE на таких объемах строк малополезны, т.к. больше времени тратится на обновление индексов, чем на поиск полным сканированием. Миниатюрные таблички, типа той, что я привел выше, занимают так мало места, что при частом пользовании все время находятся в памяти. Профиля же обычно тяжеловесны и операции по чтению и обновлению будут более накладными. Кроме того, в MySQL (на хостинге все же обычно используют это СУБД) имеется возможности кешировать результаты запросов, а частые обновления рубят эту фишку на корню.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|