Узнайте, сколько пользователей онлайн в PHP? - PullRequest
1 голос
/ 21 мая 2009

Каждое посещение моего сайта обновляет индивидуальный счетчик посещений и обновляет столбец для time(), основываясь на его IP-адресе и идентификаторе, сохраненном в файле cookie. Таким образом, при выводе данных, что является более эффективным способом моего следующего кода с меньшим количеством вызовов базы данных, так как это, по сути, его копия:

<?
$last1Min = time()-60;
$last5Mins = time()-300;
$last1Hr = time()-6000;
$last1Dy = time()-144000;
$last1Wk = time()-1008000;
$last1Mnth = time()-30240000;

//last1Min
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Min";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last minute: " . $rows['COUNT(*)'] . "<br />\n";
}

//last5Mins
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last5Mins";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last 5 minutes: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Hr
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Hr";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last hour: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Dy
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Dy";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last day: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Wk
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Wk";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last week: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Mnth
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Mnth";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last month: " . $rows['COUNT(*)'] . "<br /><br />\n";
}

Если есть более эффективный способ представления этих данных, я хочу расширить их, чтобы показать не только, сколько пользователей для каждой из этих метрик подключено ко всему моему сайту, но также записывать и выводить данные для каждой страницы. на моем сайте.

Ответы [ 4 ]

5 голосов
/ 21 мая 2009
SELECT 
  SUM(lastOnline <= 60) AS one_minute,
  SUM(lastOnline <= 300) AS five_minutes,
  ...
  SUM(lastOnline <= 30240000) AS one_month
FROM usersonline

Используя этот метод, вы можете получить все необходимое в одном запросе за одно сканирование таблицы; это не становится намного более эффективным, чем это. Как уже упоминалось, вы должны кэшировать результат, так как он относительно дорогой (даже в этой оптимизированной форме). Нет смысла вычислять это при каждой загрузке страницы, особенно если вы видите несколько обращений в секунду (что весьма вероятно, если вы, скажем, нажали первую страницу digg)

lastOnline <= 60 оценивается как 1 для строк, где условие истинно, и 0 для строк, где условие ложно; SUM () суммирует эти 1 и нули, подсчитывая количество строк, для которых выполняется условие. </p>

Изучил эту технику из комментария пользователя в документах mysql несколько лет назад; Есть подобные примеры в других местах

3 голосов
/ 21 мая 2009

Настройка задания cron, которое вычисляет правильные значения только один раз каждую минуту / 5 минут / и так далее. Кэшируйте результат и отображайте его. На самом деле нет необходимости вычислять такие характеристики X раз в секунду, когда они меняются только раз в минуту или каждые полчаса.

0 голосов
/ 21 мая 2009

Если вы сохраните свои сеансы в файлы, вы можете посчитать количество файлов, к которым был получен доступ за определенный период времени. Тогда вообще не будет доступа к базе данных.

0 голосов
/ 21 мая 2009

Вместо того, чтобы вызывать базу данных каждый раз, вы можете просто позвонить всем за последний месяц и заказать их по дате. Затем в php вы можете сравнить дату и время, чтобы увидеть, как давно пользователь вошел в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...