|
|
|
| У нас была реализована переписка юзеров через 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] = 'надо';
# и т.д.
?>
|
| |
|
|
|
|
|
|
|
для: JIEXA
(19.03.2006 в 00:01)
| | А допускается что сообщение будет в нескольких строках? Или Все сообщения однострочные? | |
|
|
|
|
|
|
|
для: Евгений Петров
(19.03.2006 в 00:07)
| | Да. сообщение может быть очень длинным и конечно же не в одну строку. | |
|
|
|
|
|
|
|
для: 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;
}
?>
|
| |
|
|
|
|
|
|
|
для: Евгений Петров
(19.03.2006 в 00:48)
| | Скрипт виснет. походу while выполняется бесконечно | |
|
|
|
|
 750 байт |
|
|
для: JIEXA
(19.03.2006 в 01:20)
| | Хм. У меня не виснет, прилагаю файл с сообщениями: | |
|
|
|
|
|
|
|
для: Евгений Петров
(19.03.2006 в 01:28)
| | Врубился. Виснет только если после сообщения стоит несколько \n\n | |
|
|
|
|
|
|
|
для: Евгений Петров
(19.03.2006 в 01:28)
| | да чуть лишнее \n и виснет.. надо другой алгоритм искать :( | |
|
|
|
|
|
|
|
для: 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'];
?>
|
| |
|
|
|
|
|
|
|
для: kasmanaft
(19.03.2006 в 09:16)
| | А если файл весит метров 15? | |
|
|
|
|
|
|
|
для: Евгений Петров
(19.03.2006 в 16:51)
| | это вы насчет
$file = file("mess.txt"); ????
ну, если не нравиться, то можно сделать как у вас $f = fopen("mess.txt","r"); но тогда потребуется цикл - и все равно придется считать весь файл :)
но по-моему это было для чата, а там 15мб. быть не может...
... или не для чата... вобщем так нагляднее :) .... отвертелся ;)) | |
|
|
|
|
|
|
|
для: kasmanaft
(20.03.2006 в 08:37)
| | Да нет я как раз о том что вы сразу читаете весь файл. У меня из файла читается только кусок (конкретные сообщения). Функция ReadNext читает только следующее сообщение но никак не весь файл | |
|
|
|
|
|
|
|
для: Евгений Петров
(20.03.2006 в 12:56)
| | зато работает :)
но можно при желании не читать весь файл, а также оформить в функцию :) | |
|
|
|
|
|
|
|
для: kasmanaft
(20.03.2006 в 13:37)
| | У меня так и сделано и, наверное, Вы очень удивитесь, но ТОЖЕ работает. :)))) | |
|
|
|
|
|
|
|
для: Евгений Петров
(20.03.2006 в 13:40)
| | действительно работает :(
а из-за вот этого поста, я подумал что нет.....
>да чуть лишнее \n и виснет.. надо другой алгоритм искать :(
приношу свои извинения :) | |
|
|
|
|
|
|
|
для: JIEXA
(19.03.2006 в 00:01)
| | А может быть стоило всего лишь выделить тела сообщений в отдельную таблицу?
Честно говоря, не представляю себе ситуации, когда вынос части системы обмена собщениями на файловый уровень смог бы устранить неприятности, а не усугубить их. ЗА исключением, может быть, ситуации, когда часть устаревших сообщений, уходя из базы,скидывается в файлы. | |
|
|
|