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

Форум PHP

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

 

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

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

тема: Функция чтения из файла строк
 
 автор: sd607   (31.01.2007 в 22:34)   письмо автору
 
 

Прошу оценить напряжность функции по чтению строк из файла. Интересует насколько она напряжна для системы.

$start - первая строка
$end - последняя
$lines - массив строк


<?php
function getLines($handle,$total,$start,$end,&$lines)
{
    if(
$start>$end || $total<=0) return 0;
    
    
fseek($handle,-2,SEEK_END);
    
$pos=ftell($handle);
            
    
$t=" ";
    
$current=1;
    
    
$idx=0;
    
    while(
$pos>=&& $current<=$total) {
        if(
fgetc($handle)=="\n" || $pos==0) {
            
            if(
$current>=$start && $current<=$end) {
                
                if(
$pos==0fseek($handle,0,SEEK_SET);
                
                
$lines[]=fgets($handle);
                                                
                
$idx++;
                
                if(
$current>$end) break;
            }
            
            
$current++;
        }
        
        
$pos--;
        
fseek($handle,$pos);
    }
}
?>


Кол-во строк в массив не более 15, не менее 4-5. Длина каждой строки не более 300 символов.

   
 
 автор: bronenos   (31.01.2007 в 23:03)   письмо автору
 
   для: sd607   (31.01.2007 в 22:34)
 

не понимаю
1. зачем там некоторые другие параметры
2. можно ли код с использованием ее
3. что именно она делает

туплю немного...

   
 
 автор: sd607   (31.01.2007 в 23:08)   письмо автору
 
   для: bronenos   (31.01.2007 в 23:03)
 

Что не понятно конкретно?

Есть текстовики вида:

100##2005##Привет. Тратататата
101##2005##Привет. Тратататата
102##2005##Привет. Тратататата
103##2005##Привет. Тратататата
104##2005##Привет. Тратататата
105##2005##Привет. Тратататата

Этот скрипт считывает построчно данные в массив $lines. А дальше уже идет разбор каждой строки explode('##',$lines[n]);

Считывание идет с конца файла. В массив посылается 4-10 строк, в зависимости от того что установлено в start и end. $TOTAL это общее кол-во строк.

Например

getLines($handle,6,1,2,$lines);

В $lines будет:

105##2005##Привет. Тратататата
104##2005##Привет. Тратататата

   
 
 автор: bronenos   (01.02.2007 в 00:44)   письмо автору
 
   для: sd607   (31.01.2007 в 23:08)
 

а не проще типа этого

<?
function getlines ($file$since$to) {
 
$file file ($file);
 
$file array_reverse ($file);

 foreach (
$file as $k=>$v) {
  if (
strlen($file[$k]) < 2)
   unset (
$file[$k]);
 }

 if (
$since count($file))
  return 
false;
 if (
$to count($file))
  return 
false;
 if (
$since $to)
  return 
false;

 for (
$i=($since-1); $i<=($to-1); $i++)
  
$return[] = $file[$i];
 return 
$return;
}
?>

   
 
 автор: sd607   (01.02.2007 в 01:28)   письмо автору
 
   для: bronenos   (01.02.2007 в 00:44)
 

Не хотел применять функцию file()

   
 
 автор: Trianon   (01.02.2007 в 00:39)   письмо автору
 
   для: sd607   (31.01.2007 в 22:34)
 

Более чем напряжна. Цикл While (...) { --$pos; fseek($pos), fgetc()... } - сущий кошмар.
Если у Вас нет в распоряжении БД для этих целей, и Вы хотите облегчить системе жизнь, имеет смысл создавать индексный файл. В котором хранить записи фиксированной длины с позициями начала строк основного файла.

   
 
 автор: sd607   (01.02.2007 в 01:19)   письмо автору
 
   для: Trianon   (01.02.2007 в 00:39)
 

Спасибо. Тогда вопрос, не подскажете источник, где я могу ознакомиться с этим? Всегда держался подальше от файлов, приперло. Или может просто пример.

   
 
 автор: Trianon   (01.02.2007 в 09:28)   письмо автору
 
   для: sd607   (01.02.2007 в 01:19)
 

Каким образом этот Ваш файл формируется и и насколько часто изменяется?
И Какого размера может достигать?

   
 
 автор: sd607   (01.02.2007 в 20:56)   письмо автору
 
   для: Trianon   (01.02.2007 в 09:28)
 

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


<?php
//Запись для отправителя
        
$handle=@fopen($folder1.'xxx.txt','ab+');
        @
flock($handle,LOCK_EX);
        @
fwrite($handle,$content);
        @
flock($handle,LOCK_UN);
        @
fclose($handle);

                
//Запись для получателя
                
$handle=@fopen($folder2.'xxx.txt','ab+');
                @
flock($handle,LOCK_EX);
                @
fwrite($handle,$content);
                @
flock($handle,LOCK_UN);
                @
fclose($handle);
?>


Фактически они зеркальны, до тех пор пока один из пользователей не удалит другого из контактов.

Насколько часто оно изменяется? Понятия не имею. Настолько часто, насколько активно ведут себя пользователи. Размер по идее даже в худшем варианте не должен привысить 1 мб. Если привысит вдруг, тогда уже... Убрал вариант с посимвольным чтение, стало хорошо. Перешел на функцию file(), но насколько долго будет оно хорошо не знаю. Базу использовать для сообщений не могу и не буду. Многократно здесь это обсуждал уже. Сейчас все довольны, и админ сервера и мускл. Но мне по-прежнему не нравятся все эти массивы. Если я не прав, подскажите пожалуйста.

Длина одной строки не более 300 символов.

ps В файлы только добавляется информация, либо читается, либо файл удаляется целиком. Больше никаких действий.

   
 
 автор: Trianon   (01.02.2007 в 21:27)   письмо автору
 
   для: sd607   (01.02.2007 в 20:56)
 


<?
$handle
=fopen($folder2.'xxx.txt','ab+'); 
                
flock($handle,LOCK_EX); 
$handle2=fopen($folder2.'xxx.idx','ab+'); 
                
flock($handle2,LOCK_EX); 
                
$pos ftell($handle); 
                
fwrite($handle2,sprintf("%08x\r\n"$pos)); 
                
flock($handle2,LOCK_UN); 
                
fclose($handle2); 
                
fwrite($handle,$content); 
                
flock($handle,LOCK_UN); 
                
fclose($handle); 

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

$num =  38;
$handle2=fopen($folder2.'xxx.idx','rb'); 
fseek($handle2$num 10SEEK_SET); // 8символов числа и 2 символа \r \n - всего 10
$pos fgets($handle2);
fclose($handle);
$pos intval(hexdec($pos));

// и прочесть нужное число записей. 
$handle=fopen($folder2.'xxx.txt','rb'); 
fseek($handle$posSEEK_SET);
fclose($handle);
for(
$i $num$i $num1$i++) $arr[] = fgets($handle);
// кстати, записи можно засовывать уже по правильным индексам. с учетом порядка. 
?> 

   
Rambler's Top100
вверх

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