| |
|
|
| | Пишу скрипт для чата. В textarea считываю строки из текстового файла, где хранятся сообщения.
while(!feof($fp))
{
$msg=fgets($fp,399);
echo $msg;
}
|
Но считывание у меня идет с начала файла и получается, что самые свежие сообщения оказываются внизу. А как сделать, чтобы они были вверху?
Спасибо. | |
| |
|
|
| |
|
|
| |
для: coloboc66
(08.09.2006 в 17:18)
| | | array_reverse | |
| |
|
|
| |
|
|
| |
для: Владимир22
(08.09.2006 в 19:38)
| | | у coloboc66 нет array. Соответственно, не кого reverse :) | |
| |
|
|
| |
|
|
| |
для: coloboc66
(08.09.2006 в 17:18)
| | | А много сообщений в файле? Можно поместить их в массив и вывести массив в обратном порядке? | |
| |
|
|
| |
|
|
| |
для: cheops
(08.09.2006 в 21:41)
| | | Да- я не подумал насчет необходимости ограничения числа сообщений в файле. Поэтому для совмещения решения этого вопроса (ограничения числа сообщений) с решением вопроса моего первого поста (перевернуть сообщения в обратном порядке) написал следующий код. Он должен при числе сообщений, превышающем установленное, запомнить последние n сообщений, удалить файл, создать новый, записать в него запомненные сообщения и возвратить новый массив сообщений. Написать-то написал, да работает она неверно почему-то- когда число сообщений в файле превышает заданное, у меня получается не так как хочу. Где ошибка- не пойму. А хоть логика рассуждений у меня верная?
<?
$f_chat='chat.txt';
$num_msg=3;//Ограничиваем кол-во сообщений в файле
$msg=file($f_chat);//выводим сообщ-я из файла в массив
$count_msg=count($msg);//считаем их
if($count_msg>$num_msg) create_new_file($num_msg,$count_msg,$f_chat,$msg);
get_msg1($msg);
function get_msg1($msg)
{
$value=end($msg);
while($value)//выводим их в обратном порядке, чтоб свежие сообщения появлялись вверху
{
echo $value;
$value=prev($msg);
}
}
function create_new_file($num_msg,$count_msg,$f_chat,$msg)
{
for($i=$count_msg-$num_msg;$i<$count_msg;$i++)
{
$msg[$i]= $msg[$i];//оставляем в массиве только нужное кол-во
}
unlink($f_chat);//удаляем файл
if(!file_exists($f_chat))
{
$f_chat =$f_chat;
$fp = fopen($f_chat, "w");
if ($fp==true) chmod($f_chat, 0777); //создаем новый файл
}
for($i=$count_msg-$num_msg;$i<$count_msg;$i++) fwrite($fp,$msg[$i]);// записываем в него запомненные сообщения
$msg=file($f_chat);
return $msg;
fclose($fp);
}
?>
|
| |
| |
|
|
| |
|
|
| |
для: coloboc66
(11.09.2006 в 17:04)
| | | Наверное нужно
if($count_msg>$num_msg) $msg = create_new_file($num_msg,$count_msg,$f_chat,$msg);
|
| |
| |
|
|
| |
|
|
| |
для: kasmanaft
(11.09.2006 в 17:40)
| | | Да, спасибо, это я не учел. А вообще я правильно мыслю, что при превышении в файле числа сообщений придется его удалять, а потом заново создавать и вписывать заранее запомненный массив? По другому ведь никак нельзя удалить из файла лишние сообщения? | |
| |
|
|
| |
|
|
| |
для: coloboc66
(11.09.2006 в 17:55)
| | | Можно не удалять сообщения вообще. Или делать это существенно реже, чем при каждом добавлении. Например раз в сутки или даже раз в месяц. А данные из файла считывать только из последней порции. И нагрузка на сервер уменьшится, и лог будет сам собой вестись. | |
| |
|
|
| |
|
|
| |
для: Trianon
(11.09.2006 в 18:16)
| | | "...А данные из файла считывать только из последней порции..." - не знаю, как это обычно делается. Я собираюсь сделать так: т.к. у меня на клиентской стороне данные из файла пишутся в textarea, я хочу выбрать из него самую свежую строку, отослать на сервер, а там скрипт по этой строке должен проанализировать содержимое файла и выдать только те строки, которые свежее переданной. Вот только не могу допетрить, как это сделать.
$a=$_GET['a']; // самая свежая строка из textarea
$f_chat='chat.txt';
$msg=file($f_chat);//выводим сообщ-я из файла в массив
$count_msg=count($msg);//считаем их
get_msg($msg,$a,$count_msg);
function get_msg($msg,$a,$count_msg)
{
for(i=0;i<$count_msg;i++)
{
if($a==$msg[i])
... Дальше мысль моя в тупик заходит...
}
}
|
| |
| |
|
|
| |
|
|
| |
для: coloboc66
(12.09.2006 в 11:18)
| | | Записывайте перед каждой строчкой время. И самое последнее время отправляйте на сервер. | |
| |
|
|
| |
|
|
| |
для: Trianon
(12.09.2006 в 12:35)
| | | СПАСИБО ВСЕМ! С грехом пополам со всеми проблемами разобрался, кроме одной (пишу здесь, чтоб не начинать новую тему): при превышении числа сообщений в файле больше заданного, функция create_new_file должна перезаписать файл, отбросив устаревшие. И она в принципе у меня работает, если я поставлю @ перед переменными, вызывающими сообщение об ошибке. Но все-равно неприятно, хотелось бы, чтоб все работало корректно. Может кто-нибудь знает, как это устранить? Или это не страшно?
$f_chat='chat.txt';
$num_msg=10;//Ограничиваем кол-во сообщений в файле
$msg=file($f_chat);//выводим сообщ-я из файла в массив
$count_msg=count($msg);//считаем их
if($count_msg>$num_msg) $msg=create_new_file($num_msg,$count_msg,$f_chat,$msg);
get_msg($msg,$a,$count_msg);
}
function create_new_file($num_msg,$count_msg,$f_chat,$msg)
{
for($i=$count_msg-$num_msg;$i<$count_msg;$i++) @$msg[$i]= @$msg[$i];//оставляем в массиве только нужное кол-во Вот здесь у меня выскакивает ошибка "undefined offset 10" (если $num_msg=10)
unlink($f_chat);//удаляем файл
if(!file_exists($f_chat))
{
$f_chat =$f_chat;
$fp = fopen($f_chat, "w");
if ($fp==true) chmod($f_chat, 0777); //создаем новый файл
}
for($i=$count_msg-$num_msg;$i<$count_msg;$i++) fwrite($fp,$msg[$i]);// записываем в него запомненные сообщения
$msg=file($f_chat);
return $msg;
fclose($fp);
}
|
| |
| |
|
|
| |
|
|
| |
для: coloboc66
(12.09.2006 в 17:28)
| | | Хм... А зачем вам строка
<?php
@$msg[$i]= @$msg[$i];
?>
|
она же не осуществляет никакой работы? | |
| |
|
|
| |
|
|
| |
для: cheops
(12.09.2006 в 18:37)
| | |
for($i=$count_msg-$num_msg;$i<$count_msg;$i++) @$msg[$i]= @$msg[$i];
|
Она по идее перезаписывает массив с сообщениями из файла, чтоб отбросить устаревшие сообщения. | |
| |
|
|