Как это кто есть на сайте? Сколько человек, страна, ОС - это что ли? Вариант: написать скрипт или скачать или заказать
Что-то как-то мало кто пишет. Запостю один простенький вариант(ахтунг подходит для проектов с не очень высокой нагрузкой). 1. Создаем таблицу users_online: [sql] CREATE TABLE `users_online`( `uid` INT NOT NULL, `last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE(`uid`), INDEX(`last_update`) ); [/sql] 2. Когда пользователь логинится выполняем [sql] INSERT INTO `users_online` SET `uid`=5; [/sql] 3. Когда пользователь посещает какую-нибудь страничку выполняем [sql] UPDATE `users_online` SET `last_update` = NOW() WHERE `uid`=5; [/sql] Разумеется можно совместить 2. и 3. пункты и вызывать всегда один и тот же запрос: [sql] INSERT INTO `users_online`(`uid`) VALUES (5) ON DUPLICATE KEY UPDATE `last_update`=NOW(); [/sql] 4. Когда пользователь разлогинивается выполняем: [sql] DELETE FROM `users_online` WHERE `uid`=5; [/sql] 5. Допустим, пользователь, который не посещает ни одной страницы в течении 15-ти минут ушел с сайта. Поэтому по крону выполняем такой запрос: [sql] DELETE FROM `users_online` WHERE `last_update` < NOW()-900; [/sql] 900=15 минут * 60 секунд 6. Ну и наконец, выполнив: [sql] SELECT `uid` FROM `users_online` [/sql] Мы получим id-ки пользователей, который онлайн в данный момент. Что бы получить их с именами можно выполнить [sql] SELECT `u`.`name` FROM `users_online` AS `uo` LEFT JOIN `users` AS `u` ON `u`.`id`=`uo`=`uid`; [/sql] или [sql] SELECT `name` FROM `users` WHERE `id` IN (SELECT `uid` FROM `users_online`); [/sql] по вкусу.
newpdv, с ходу могу придумать два варианта: 1. Записываем (в файл, в БД, неважно) дату последней "чистки" и сверяем ее при каждом заходе пользователя. Если с момента последней чистки прошло более 15 минут чистим таблицу. Получаем лишний запрос к БД/файлу каждый раз при заходе пользователя + сильный "провал" при обновлении таблицы онлайн. 2. Вариант на который плюются многие старожилы, но все же ИМХО имеющий право на существование: Смотрим статистику и обнаруживаем, что у нас заходит в среднем 100 пользователей в минуту. Соответственно заходит примерно 1500 пользователей за 15 минут. Значит, грубо говоря, с каждым 1500-м пользователем проходит 15 минут. При заходе пользователя делаем: PHP: <?php $number = rand(1, 1500); if($number == 12){ // чистим таблицу онлайн пиплов } ?> не получаем лишний запрос к БД/Файлу при каждом запросе, но точность 15 минутного интервала остается под вопросом. Ночью, это может быть значительно реже 15-ти минут, в период с 16 до 22(или какой там у вас "час пик" на ресурсе) немного чаще. Но оптимальным вариантом все равно, на мой взгляд, является крон.
С выходом мускула 5.1 я бы сказал, что его встроенный евент шедулер оптимальней. Но это как всегда, решение не для нищебродов )