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

Форум PHP

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

 

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

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

тема: Переписка на файлах
 
 автор: JIEXA   (19.03.2006 в 00:01)   письмо автору
 
 

У нас была реализована переписка юзеров через MySQL. Но база растет/нагрузка растет. решил записывать все сообщения в файлы, а в MySQL только кто кому написал и когда(чтобы извещать пользователя а новых сообщениях). Структуру файла хочу сделать типа такой(примерно также как записывается история в QIP):

->-------------------------------------<-
fabik (14:09:36 18/03/2006)
да не помню я как точно

->-------------------------------------<-
fabik (14:09:40 18/03/2006)
нафиг тебе эта ссылка

->-------------------------------------<-
JIEXA (14:09:46 18/03/2006)
надо

->-------------------------------------<-
JIEXA (14:10:10 18/03/2006)
именно ещё чтобы action ставился

->-------------------------------------<-
JIEXA (14:18:16 18/03/2006)
ну что?

->-------------------------------------<-
JIEXA (14:18:22 18/03/2006)
:(

->-------------------------------------<-
fabik (14:19:09 18/03/2006)
ищу

->-------------------------------------<-
JIEXA (14:19:14 18/03/2006)
)

->-------------------------------------<-
fabik (14:25:55 18/03/2006)
леха я не могу найти


Вопрос такой: как парсить?
Надо бы, чтобы все это уложилось красиво в массив. "->-------------------------------------<-" - разделить сообщений. Желательно, чтобы на выходе получилось типа:

<?
$messages
[1][name] = 'fabik';
$messages[1][date]  = '14:09:36 18/03/2006';
$messages[1][txt]  = 'да не помню я как точно';

$messages[2][name] = 'fabik';
$messages[2][date]  = '14:09:40 18/03/2006';
$messages[2][txt]  = 'нафиг тебе эта ссылка';

$messages[3][name] = 'JIEXA';
$messages[3][date]  = '14:09:46 18/03/2006';
$messages[3][txt]  = 'надо';

# и т.д.
?>

   
 
 автор: Евгений Петров   (19.03.2006 в 00:07)   письмо автору
 
   для: JIEXA   (19.03.2006 в 00:01)
 

А допускается что сообщение будет в нескольких строках? Или Все сообщения однострочные?

   
 
 автор: JIEXA   (19.03.2006 в 00:21)   письмо автору
 
   для: Евгений Петров   (19.03.2006 в 00:07)
 

Да. сообщение может быть очень длинным и конечно же не в одну строку.

   
 
 автор: Евгений Петров   (19.03.2006 в 00:48)   письмо автору
 
   для: JIEXA   (19.03.2006 в 00:21)
 

Ну могу предложить нечто подобное, но только сам файл должен начинатсья НЕ с разделителя а сразу должно идти имя дата и сообщение а потом разделитель
<?
  $f 
fopen("mess.txt","r");
  
print_r(ReadNext($f));

  function 
ReadNext($f)
  {
    
$head fgets($f);
    
preg_match("|(.+) \((.+)\)|i",$head,$head);
    
$messages['name'] = trim($head[1]);
    
$messages['date'] = trim($head[2]);
    
$txt "";
    while(
true)
    {
      
$line fgets($f);
      if(
trim($line) == "->-------------------------------------<-")
        break;
      else
        
$txt.= $line;
    }
    
$messages['txt'] = trim($txt);
    return 
$messages;
  }
?>

   
 
 автор: JIEXA   (19.03.2006 в 01:20)   письмо автору
 
   для: Евгений Петров   (19.03.2006 в 00:48)
 

Скрипт виснет. походу while выполняется бесконечно

   
 
 автор: Евгений Петров   (19.03.2006 в 01:28)   письмо автору
750 байт
 
   для: JIEXA   (19.03.2006 в 01:20)
 

Хм. У меня не виснет, прилагаю файл с сообщениями:

   
 
 автор: JIEXA   (19.03.2006 в 01:33)   письмо автору
 
   для: Евгений Петров   (19.03.2006 в 01:28)
 

Врубился. Виснет только если после сообщения стоит несколько \n\n

   
 
 автор: JIEXA   (19.03.2006 в 01:40)   письмо автору
 
   для: Евгений Петров   (19.03.2006 в 01:28)
 

да чуть лишнее \n и виснет.. надо другой алгоритм искать :(

   
 
 автор: kasmanaft   (19.03.2006 в 09:16)   письмо автору
 
   для: JIEXA   (19.03.2006 в 01:40)
 

вот... глянь сюды:

<?
$id_msg 
'';
$file file("mess.txt");
for (
$i 0$i count($file); $i++)
{
        if (
trim($file[$i]) == "->-------------------------------------<-")
        {
                
$id_msg++;
                
$next_msg false;
        }
        if (
ereg ("([a-zA-Z0-9]+) (\([0-9:/ ]+\))+",$file[$i],$exp))
        {
                
$messages[$id_msg]['name'] = $exp[1];
                
$messages[$id_msg]['date'] = $exp[2];
                
$next_msg true;
                continue;
        }
        if (
$next_msg)
        {
            if (!empty(
$messages[$id_msg]['txt']))
                 
$msg $messages[$id_msg]['txt'];
            else 
$msg '';
           
$messages[$id_msg]['txt'] = str_replace ("\n",'<br>',$msg.$file[$i]);

        }
}
echo 
$messages[1]['name'].'<br>';
echo 
$messages[1]['date'].'<br>';
echo 
$messages[1]['txt'];
?>

   
 
 автор: Евгений Петров   (19.03.2006 в 16:51)   письмо автору
 
   для: kasmanaft   (19.03.2006 в 09:16)
 

А если файл весит метров 15?

   
 
 автор: kasmanaft   (20.03.2006 в 08:37)   письмо автору
 
   для: Евгений Петров   (19.03.2006 в 16:51)
 

это вы насчет
$file = file("mess.txt"); ????
ну, если не нравиться, то можно сделать как у вас $f = fopen("mess.txt","r"); но тогда потребуется цикл - и все равно придется считать весь файл :)

но по-моему это было для чата, а там 15мб. быть не может...

... или не для чата... вобщем так нагляднее :) .... отвертелся ;))

   
 
 автор: Евгений Петров   (20.03.2006 в 12:56)   письмо автору
 
   для: kasmanaft   (20.03.2006 в 08:37)
 

Да нет я как раз о том что вы сразу читаете весь файл. У меня из файла читается только кусок (конкретные сообщения). Функция ReadNext читает только следующее сообщение но никак не весь файл

   
 
 автор: kasmanaft   (20.03.2006 в 13:37)   письмо автору
 
   для: Евгений Петров   (20.03.2006 в 12:56)
 

зато работает :)
но можно при желании не читать весь файл, а также оформить в функцию :)

   
 
 автор: Евгений Петров   (20.03.2006 в 13:40)   письмо автору
 
   для: kasmanaft   (20.03.2006 в 13:37)
 

У меня так и сделано и, наверное, Вы очень удивитесь, но ТОЖЕ работает. :))))

   
 
 автор: kasmanaft   (20.03.2006 в 13:54)   письмо автору
 
   для: Евгений Петров   (20.03.2006 в 13:40)
 

действительно работает :(
а из-за вот этого поста, я подумал что нет.....
>да чуть лишнее \n и виснет.. надо другой алгоритм искать :(
приношу свои извинения :)

   
 
 автор: Trianon   (20.03.2006 в 10:15)   письмо автору
 
   для: JIEXA   (19.03.2006 в 00:01)
 

А может быть стоило всего лишь выделить тела сообщений в отдельную таблицу?
Честно говоря, не представляю себе ситуации, когда вынос части системы обмена собщениями на файловый уровень смог бы устранить неприятности, а не усугубить их. ЗА исключением, может быть, ситуации, когда часть устаревших сообщений, уходя из базы,скидывается в файлы.

   
Rambler's Top100
вверх

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