|
|
|
| Прошу оценить напряжность функции по чтению строк из файла. Интересует насколько она напряжна для системы.
$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>=0 && $current<=$total) {
if(fgetc($handle)=="\n" || $pos==0) {
if($current>=$start && $current<=$end) {
if($pos==0) fseek($handle,0,SEEK_SET);
$lines[]=fgets($handle);
$idx++;
if($current>$end) break;
}
$current++;
}
$pos--;
fseek($handle,$pos);
}
}
?>
|
Кол-во строк в массив не более 15, не менее 4-5. Длина каждой строки не более 300 символов. | |
|
|
|
|
|
|
|
для: sd607
(31.01.2007 в 22:34)
| | не понимаю
1. зачем там некоторые другие параметры
2. можно ли код с использованием ее
3. что именно она делает
туплю немного... | |
|
|
|
|
|
|
|
для: 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##Привет. Тратататата | |
|
|
|
|
|
|
|
для: 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;
}
?>
|
| |
|
|
|
|
|
|
|
для: bronenos
(01.02.2007 в 00:44)
| | Не хотел применять функцию file() | |
|
|
|
|
|
|
|
для: sd607
(31.01.2007 в 22:34)
| | Более чем напряжна. Цикл While (...) { --$pos; fseek($pos), fgetc()... } - сущий кошмар.
Если у Вас нет в распоряжении БД для этих целей, и Вы хотите облегчить системе жизнь, имеет смысл создавать индексный файл. В котором хранить записи фиксированной длины с позициями начала строк основного файла. | |
|
|
|
|
|
|
|
для: Trianon
(01.02.2007 в 00:39)
| | Спасибо. Тогда вопрос, не подскажете источник, где я могу ознакомиться с этим? Всегда держался подальше от файлов, приперло. Или может просто пример. | |
|
|
|
|
|
|
|
для: sd607
(01.02.2007 в 01:19)
| | Каким образом этот Ваш файл формируется и и насколько часто изменяется?
И Какого размера может достигать? | |
|
|
|
|
|
|
|
для: 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 В файлы только добавляется информация, либо читается, либо файл удаляется целиком. Больше никаких действий. | |
|
|
|
|
|
|
|
для: 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 * 10, SEEK_SET); // 8символов числа и 2 символа \r \n - всего 10
$pos = fgets($handle2);
fclose($handle);
$pos = intval(hexdec($pos));
// и прочесть нужное число записей.
$handle=fopen($folder2.'xxx.txt','rb');
fseek($handle, $pos, SEEK_SET);
fclose($handle);
for($i = $num; $i < $num1; $i++) $arr[] = fgets($handle);
// кстати, записи можно засовывать уже по правильным индексам. с учетом порядка.
?>
|
| |
|
|
|