узнаю сколько чел онлайн ... таблицы повреждаются .. гланьте код плиз ...

Сенсей

Новичок
узнаю сколько чел онлайн ... таблицы повреждаются .. гланьте код плиз ...

Вобщем если сайт с посещаемеостью более 3000 тысяч в день .... то время от времени повреждается таблица куда я заношу ip и время ... может код кривой ? кляньте плиз ...

PHP:
function online() {
    global $prefix, $dbi;
    $ip = getenv("REMOTE_ADDR");
    $past = time()-1800;
    sql_query("DELETE FROM ".$prefix."_session WHERE time < $past", $dbi);
    $result = sql_query("SELECT time FROM ".$prefix."_session WHERE host_addr='$ip'", $dbi);
    $ctime = time();
    if ($row = sql_fetch_array($result, $dbi)) {
	sql_query("UPDATE ".$prefix."_session SET time='$ctime', host_addr='$ip' WHERE host_addr='$ip'", $dbi);
    } else {
	sql_query("INSERT INTO ".$prefix."_session VALUES ('$ctime', '$ip')", $dbi);
    }
}
Или проблема у хоста ?
 

Фанат

oncle terrible
Команда форума
ну что, болезный, сам не сообразишь?
повреждается таблица
это что? выдает ошибку 127? или бэд блок на диске появляется? Тоже нет?

А менее туманно слабо написать?
 

Demiurg

Guest
совентую подумать над этим:
[m]sql_query[/m]
нор в любом случаен за тебя здесь делать твою работу никто не будет.
 

Сенсей

Новичок
Что и как с ней происходит я не знаю ... Знаю только что таблица не работает ... и phpmyadmin ее не отображает и пишет что таблица повреждена ....

Приходится удалять и создавать заного ...

[qoute]совентую подумать над этим:
sql_query
нор в любом случаен за тебя здесь делать твою работу никто не будет.[/qoute]

И ?
 

Demiurg

Guest
"таблица не работет" это что то новое ...
можешь процетировать phpmyadmin ? что он по поводу этой таблицы пишет...
 

Фанат

oncle terrible
Команда форума
попробуй вот эту функцию
PHP:
function online($timeout=180) { 
  mysql_query("DELETE FROM session WHERE time < unix_timestamp()-$timeout"); 
  mysql_query("REPLACE session VALUES ('".getenv("REMOTE_ADDR")."',unix_timestamp())"); 
  $result = mysql_query("SELECT COUNT(*) FROM session"); 
  $count = mysql_fetch_array($result); 
  return $count[0]; 
} 

echo online();
только что у тебя там еще за префиксы?
 

Фанат

oncle terrible
Команда форума
однако чувак размахнулся.
считает, что люди на его сайте по 30 минут сидят на одной странице.
врет и не краснеет.
а туда же - сенсей.
 

Сенсей

Новичок
OK , сенкс , попробовать попробую ... ток что то не нашел у тебя где я добавляю $ip и время если юзер первый раз зашел .... или просто мне оставил ? :)

Кстати, я свою немножко исправил .. мож так будет лучше

PHP:
function online() {
    global $prefix, $dbi;
    $ip = getenv("REMOTE_ADDR");
    $past = time()-1800;
    sql_query("DELETE FROM ".$prefix."_session WHERE time < $past", $dbi);
    $result = sql_query("SELECT time FROM ".$prefix."_session WHERE host_addr='$ip'", $dbi);
    $row = sql_num_rows($result, $dbi);
    $ctime = time();
    if ($row != 0 ) {
	sql_query("UPDATE ".$prefix."_session SET time='$ctime', host_addr='$ip' WHERE host_addr='$ip'", $dbi);
    } else {
	sql_query("INSERT INTO ".$prefix."_session VALUES ('$ctime', '$ip')", $dbi);
    }
}
Что за ошибка пишет - щас не скажу .... завра заного внедрю функцию в сайт и посмотрю ...... а то пришлось убрать ....

Вобщем завтра все проверю - скажу результат ...
 

clevel

Новичок
вопрос: а зачем вы удаляете записи?
Я, например, делаю всего ДВЕ операции:
1.replace для каждого юзера, primary key на userid(уникальное число). Этим я имею на каждого юзера по одной записи
2.Select count(*) .... where last_time>=time()-180...
Синтаксис, естественно, опустил.. но мысль ясна....
 

Фанат

oncle terrible
Команда форума
а зачем их плодить?
твои две на таблице в тыщу юзеров будут работать дольше, чем мои три на таблице в десяток.
и индексов никаких не надо.

чем тебя так пугает третий запрос и какой повод для гордости в двух?
 

clevel

Новичок
да причем здесь гордость, Фанат!
Я просто хочу найти оптимальное решение... поэтому и задал вопрос...
у тебя в любом случае удаление использует в where такое же условие, что и меня во втором запросе... поэтому насчет большей скорости у тебя я сильно сомневаюсь....
Добавь к этому, что у тебя сначала идет удаление, потом перестройка индекса(тоже надо).... а уж потом подсчет мертвых душ...
 

IntenT

SkyDiver
clevel
Как думаешь, где запрос выполнится быстрее:
на таблице с 10 записями, или на таблице с 10000 записей?
 

clevel

Новичок
согласен, 10 и 10000 разница есть....
но есть но.... если это форум... и постоянные посетители не один-два человека, то мой вариант тоже имеет право на жизнь...
хотя на заметку возьму... эх, совсем с борьбой за количество запросов голову потерял.. :)
 

Фанат

oncle terrible
Команда форума
IntenT, в общем, при наличии индекса, довольно неотличимо.
И, пожалуй, в словах клевела есть своя правда.
но таблицу чистить все-таки, надо. кроном, к примеру.
С другой стороны, всякие попытки оптимизации таблицы в десяток строк дадут такой мизерный выигрыш в производительности, о котором врядли стоит вообще говорить.
И которые явно не стоят отдельно возни с чисткой таблицы.
вот как я думаю...
Но послушаем, если кто-то захочет высказаться тоже.
 

me|xeon

Guest
Запрос будет выполнятся дольше, но разве это имеет значение? Ну сгенерится у тебя страничка не за 1, а за 2 секунды... Один болт она секунд 10-20 будет юзеру отправляться... Хотя разница в секунду из-за одной выборки из таблицы это я загнууул..

ЗЫ: Потенциальный косяк:
Следующие запросы выполняются последовательно:

DELETE from
where time+[expire]<now()
и
UPDATE
where ip='[ip]'

Возможно нечего апдейтить будет.
 

Alien

Новичок
Дай ка я угадаю - ты этот online() на каждый чих юзверя на загрузку страницы вызываешь?

Изззумительно.
Разделяй функционал.

1 при загрузке страницы только insert.

2 вызывать периодически по крону чистку таблицы, тогда же определять сколько юзверей онлайн и заносить куда то на будущее (в табличку с 1 записью - 20 человек онлан, в файл - пофиг, как удобней).

3 при загрузке страницы где наод показать сколько онлайн народа - делать 1 селект (или смотреть 1 файл) - сколько посетителей онлайн.

Запрос будет выполнятся дольше, но разве это имеет значение? Ну сгенерится у тебя страничка не за 1, а за 2 секунды... Один болт она секунд 10-20 будет юзеру отправляться...
БД большая, и не такое вытерпит, да?
1 За одну секунду страниц должно генерится хотя бы десяток (т.е время генерации страницы хотя бы 0.1 секунда).
2 Отдаются они не 20 секунд - не все на таком тормознутом диалапе сидят как ты (=
 

sergo_stavropol

Guest
ну не всегда, скажем так, доступ к крону есть
так что вполне нормально удалять старье при каждм вызове прграммы. Некритично.
 
Сверху