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

Форум PHP

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

 

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

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

тема: Очередность строк, считываемых из файла
 
 автор: coloboc66   (08.09.2006 в 17:18)   письмо автору
 
 

Пишу скрипт для чата. В textarea считываю строки из текстового файла, где хранятся сообщения.

while(!feof($fp))
{
$msg=fgets($fp,399);
echo $msg;
}

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

   
 
 автор: Владимир22   (08.09.2006 в 19:38)   письмо автору
 
   для: coloboc66   (08.09.2006 в 17:18)
 

array_reverse

   
 
 автор: Trianon   (08.09.2006 в 20:11)   письмо автору
 
   для: Владимир22   (08.09.2006 в 19:38)
 

у coloboc66 нет array. Соответственно, не кого reverse :)

   
 
 автор: cheops   (08.09.2006 в 21:41)   письмо автору
 
   для: coloboc66   (08.09.2006 в 17:18)
 

А много сообщений в файле? Можно поместить их в массив и вывести массив в обратном порядке?

   
 
 автор: coloboc66   (11.09.2006 в 17:04)   письмо автору
 
   для: 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_msgcreate_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==truechmod($f_chat0777); //создаем новый файл   
   

   for(
$i=$count_msg-$num_msg;$i<$count_msg;$i++)   fwrite($fp,$msg[$i]);// записываем в него запомненные сообщения
   
$msg=file($f_chat);
   return 
$msg;
  
fclose($fp);
}
?>

   
 
 автор: kasmanaft   (11.09.2006 в 17:40)   письмо автору
 
   для: coloboc66   (11.09.2006 в 17:04)
 

Наверное нужно

if($count_msg>$num_msg) $msg = create_new_file($num_msg,$count_msg,$f_chat,$msg);

   
 
 автор: coloboc66   (11.09.2006 в 17:55)   письмо автору
 
   для: kasmanaft   (11.09.2006 в 17:40)
 

Да, спасибо, это я не учел. А вообще я правильно мыслю, что при превышении в файле числа сообщений придется его удалять, а потом заново создавать и вписывать заранее запомненный массив? По другому ведь никак нельзя удалить из файла лишние сообщения?

   
 
 автор: Trianon   (11.09.2006 в 18:16)   письмо автору
 
   для: coloboc66   (11.09.2006 в 17:55)
 

Можно не удалять сообщения вообще. Или делать это существенно реже, чем при каждом добавлении. Например раз в сутки или даже раз в месяц. А данные из файла считывать только из последней порции. И нагрузка на сервер уменьшится, и лог будет сам собой вестись.

   
 
 автор: coloboc66   (12.09.2006 в 11:18)   письмо автору
 
   для: 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]) 
... Дальше мысль моя в тупик заходит...
}
}

   
 
 автор: Trianon   (12.09.2006 в 12:35)   письмо автору
 
   для: coloboc66   (12.09.2006 в 11:18)
 

Записывайте перед каждой строчкой время. И самое последнее время отправляйте на сервер.

   
 
 автор: coloboc66   (12.09.2006 в 17:28)   письмо автору
 
   для: 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);
}

   
 
 автор: cheops   (12.09.2006 в 18:37)   письмо автору
 
   для: coloboc66   (12.09.2006 в 17:28)
 

Хм... А зачем вам строка
<?php
  
@$msg[$i]= @$msg[$i];
?>

она же не осуществляет никакой работы?

   
 
 автор: coloboc66   (13.09.2006 в 09:16)   письмо автору
 
   для: cheops   (12.09.2006 в 18:37)
 


for($i=$count_msg-$num_msg;$i<$count_msg;$i++)  @$msg[$i]= @$msg[$i];

Она по идее перезаписывает массив с сообщениями из файла, чтоб отбросить устаревшие сообщения.

   
Rambler's Top100
вверх

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