Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Чат на файлах (удаление лишних сообщений)
 
 автор: Roo$   (27.10.2006 в 23:07)   письмо автору
 
 

Я делаю чат на файлах. И столкнулся с токой проблемой. Все сообщения чата я хроню в одном файле. Каждая строка это есть сообщение. Как можно выводить последние 20 сообщений из файла? Или можит как-нибудь можно удалить из файла определенное кол-во сообщений?

   
 
 автор: DEM   (27.10.2006 в 23:38)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:07)
 

А какйо смысл? Если в чате будет только 20 сообщений, как-то имхо не правильно, это тогда уже гостевая книга называется (я не вижу смысла делать чат на AJAX в таком случае)... А вообще где-то я на такой же вопрос отввечал, поищите поисковиком...

   
 
 автор: Unkind™   (27.10.2006 в 23:40)   письмо автору
 
   для: DEM   (27.10.2006 в 23:38)
 

Если в чате будет только 20 сообщений
Автор спрашивал про вывод двадцати сообщений...

   
 
 автор: Roo$   (27.10.2006 в 23:41)   письмо автору
 
   для: DEM   (27.10.2006 в 23:38)
 

Я к примеру тебе говорю 20 сообщений. Представь....в файле у меня 100 и более сообщений и че мне их все выводить? Мне нужно вывести допустим только последние 20-50 сообщений. Или как нибудь их удалять с файла...

   
 
 автор: Unkind™   (27.10.2006 в 23:42)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:41)
 

Зря Вы чат на файлах делаете...

   
 
 автор: Roo$   (27.10.2006 в 23:45)   письмо автору
 
   для: Unkind™   (27.10.2006 в 23:42)
 

Я знаю.... что лучше в базе (там бы я уже давно это сделал бы)... но задача у меня такая.

   
 
 автор: DEM   (27.10.2006 в 23:46)   письмо автору
 
   для: Unkind™   (27.10.2006 в 23:42)
 

А мне кажется нет... Даже VOODOO-чат построен на файлах (хотя там сокет-сервер написан на C++, C и PERL и весит где-то 160 кб)... Просто я думаю хранить данные в MySQL как-то странно, ну а если у него будет дофига сообщений? Все они будут хранится в БД и всё это будет храниться в БД?

   
 
 автор: Unkind™   (27.10.2006 в 23:50)   письмо автору
 
   для: DEM   (27.10.2006 в 23:46)
 

Просто я думаю хранить данные в MySQL как-то странно, ну а если у него будет дофига сообщений? Все они будут хранится в БД и всё это будет храниться в БД?
Да, а что тут такого? Ну и старые сообщения будут в каждое заданное время удаляться - это же чат, онлайн беседа, где сообщения месяцами храниться не должны, как на форумах...
А в чате очень важна быстрая и качественная выборка сообщений...Игнор, приват и т.д.

   
 
 автор: kasmanaft   (27.10.2006 в 23:44)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:07)
 

Если это чат, то сообщения должны быть не большими ...
следовательно, если сообщений 20 - файл маленький и его смело можно засунуть в массив - file()

<?
$file 
file('messages.txt');
if (
count($file) > 20)
 while (
count($file) != 20)
  
array_shift($file);
// или $file = array_splice($file, -20);
// В массиве 20 строк - теперь осталось их просто вывести.
$str implode("\r\n"$file);
$msg fopen ('messages.txt''w');
fputs($msg$str);
fclose($msg);
?>

При большом кол-ве обращений к файлу, он может обнулиться ..

   
 
 автор: Roo$   (27.10.2006 в 23:53)   письмо автору
 
   для: kasmanaft   (27.10.2006 в 23:44)
 

А можно ли сделать так? Считаем в файле кол-во сторок (т.е. сообщений) и если там больше 50 то удаляем первые 30 строк.

   
 
 автор: kasmanaft   (27.10.2006 в 23:58)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:53)
 

Ага :

if (count($file) > 50) 
  $file = array_splice($file, -20);


а вооще-то так мы получим последние 20 сообщений ...
по вопросу правильнее было бы так:


if (count($file) > 50) 
  $file = array_splice($file, 30);

   
 
 автор: cheops   (27.10.2006 в 23:44)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:07)
 

А какой форма файла, в котором хранятся сообщения?

   
 
 автор: Roo$   (27.10.2006 в 23:48)   письмо автору
 
   для: cheops   (27.10.2006 в 23:44)
 

сообщения все хронятся в файле следующим образом
ник::Само сообщение::дата

   
 
 автор: cheops   (27.10.2006 в 23:50)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:48)
 

Дата в каком формате хранится? UNIXSTAMP?

   
 
 автор: Roo$   (27.10.2006 в 23:55)   письмо автору
 
   для: cheops   (27.10.2006 в 23:50)
 


$data =date("H:i:s Y-m-d");

   
 
 автор: Unkind™   (27.10.2006 в 23:57)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:55)
 

>

>$data =date("H:i:s Y-m-d");
>


Тогда Вам лучше еще сделать ::".time()."

   
 
 автор: Roo$   (28.10.2006 в 00:01)   письмо автору
 
   для: Unkind™   (27.10.2006 в 23:57)
 

зачем time()? Он мне и так показывет время ($data =date("H:i:s Y-m-d"); выводит след. 17:46:12 2006-10-27)

   
 
 автор: Unkind™   (28.10.2006 в 00:05)   письмо автору
 
   для: Roo$   (28.10.2006 в 00:01)
 

Для того, чтобы удобнее сообщения удалять было, где time < (time() - 3600), например....

   
 
 автор: kasmanaft   (28.10.2006 в 00:14)   письмо автору
 
   для: Unkind™   (28.10.2006 в 00:05)
 

Можно конечно ... но легче наверное воспользоваться ф-й strtotime

   
 
 автор: Unkind™   (27.10.2006 в 23:51)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:48)
 

А сортировка будет от старых сообщений к новым? Т.е.

ник::Старое сообщение::дата
ник::Новее::дата
ник::Самое новое::дата

   
 
 автор: Roo$   (27.10.2006 в 23:56)   письмо автору
 
   для: Unkind™   (27.10.2006 в 23:51)
 

да именно так

   
 
 автор: DEM   (27.10.2006 в 23:54)   письмо автору
 
   для: Roo$   (27.10.2006 в 23:07)
 

Почему-то мне кажется что вы не ожидали такого наплыва вопросов ))))

   
 
 автор: Lstasss   (28.10.2006 в 02:11)   письмо автору
 
   для: DEM   (27.10.2006 в 23:54)
 

у меня ЕСТЬ такой чат. потестировал я его, уже при четырёх пользователях он уже еле волочился. поэтому не рекомендую.
технически это делается так:

if($ACTION=="add")
{
$file=fopen("chat.txt", "r");
flock($file, 1);

for($lineNr=1;true;$lineNr++)
{
$linia=fgets($file, 81);

if(!$linia)
break;

$linie[$lineNr]=$linia;
}

flock($file, 3);
fclose($file);

$nLines=$lineNr;

$file=fopen("chat.txt", "w");
flock($file, 2);

if($nLines<16)
$lineNr=1;
else
$lineNr=2;

for(;$lineNr<$nLines;$lineNr++)
fwrite($file, $linie[$lineNr]);

fwrite($file, "<FONT COLOR=$KOLOR>$IMIE></FONT> $TEKST");
fwrite($file, "\n");

flock($file, 3);
fclose($file);
}
скрипт писался поляком, имена на польском, но, думаю, всё понятно :-)

   
 
 автор: Roo$   (28.10.2006 в 23:16)   письмо автору
 
   для: Lstasss   (28.10.2006 в 02:11)
 

Всем большое спасибо за помощь. Все советы учту.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования