Снова фаилы

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
681
Реакции
114
существует проблема


когда память закончится, т.к. фаил будет больше чем объем памяти, то будет фатал ерор
как сделать так что бы фаил читался, скажем с определнной позиции допустим со строки 30 до 50
при условии что длина строки не известна!

$db_array=file($this->path($mod,$ext));

ниже прилигаю свой класс данных

PHP:
<?php
if(!defined('_SHELL')) die();

/**
* Класс Данных
*/
class DB
{
var $version=0.02;	
var $sleep =1;
var $protect="<?php die();?>\r\n";
//BEGIN	class Data

//---Работа с фаилами БД---
/**
* Путь к БД
* @param string имя БД
* @param string класификатор БД
* @return string
*/
function path($db,$ext)
{
return DB_DIR.DB_PREFIX.$db."/".$ext.".php";
}
/**
* Подготовка записи БД, для сбора информации
* @param string БД в строке
* @return string
*/
function trim(&$str)
{
$str=trim($str);	
$str=str_replace ("\n","[n]",$str);
$str=str_replace ("\r","[r]",$str);
$str=str_replace ("\t","[t]",$str);
return $str;
}
/**
* Подготовка записи БД, для сохранения информации
* @param string БД в строке
* @return string
*/
function untrim(&$str)
{
$str=str_replace("[n]","\n",$str);
$str=str_replace("[r]","\r",$str);
$str=str_replace("[t]","\t",$str);
return $str;
}
/**
* Различность 2-х БД, удаление из БД указанных записей
* @param string БД в строке
* @return string
*/
function difference(&$db_array,$difference)
{
return array_diff($difference,$db_array);
}
/**
* Открыть БД
* @return array
*/
function open($mod='',$ext='data')
{
if(($mod!='') || (!empty($mod))):
  if(!file_exists($this->path($mod,$ext))): 
    return array();
  else:
    $db_array=file($this->path($mod,$ext));
    array_shift($db_array);
  endif;
endif;
return $db_array;
}
/**
* Сохранить БД
* @param array $db_array
*/
function save($db_array,$mod=false,$ext='data')
{
array_unshift($db_array,"<?php die();?>\r\n");
if(($mod!='') || (!empty($mod))): 
  $db=$this->path($mod,$ext); 
endif;
$fdb=fopen($db,'ab');
if($this->sleep): sleep($this->sleep); endif;
@flock($fdb,LOCK_EX+LOCK_NB); // блокируем
fseek($fdb,0);
ftruncate($fdb,0); // очищаем
set_file_buffer($fdb,0); // отключаем буфер
foreach($db_array as $string):
  fwrite($fdb,$this->trim($string)."\r\n");
  fflush($fdb); //очищение файлового буфера и записьв файл 
endforeach;
@flock($fdb,LOCK_UN);
fclose($fdb);
unset($db_array);
}
/**
* Добавить данные в БД
* @param array $db_insert Что добавить
* @param array $db_array Во добавить
* @param string $mode Куда добавить 'shift'-начало 'push'-конец
* @param string $separator разделитель
* @return array
*/
function add($db_insert,&$db_array,$mode='push',$separator=':|:')
{
if($mode=='push'): 
  array_push($db_array,implode($separator,$db_insert)."\r\n"); //конец
elseif($mode=='shift'): 
  array_unshift($db_array,implode($separator,$db_insert)."\r\n"); //начало
endif;
return $db_array;
}
/**
* Удалить данные из БД
* @param array $db_array Где удалять
* @param integer $index Индекс записи
* @return array
*/
function delete(&$db_array,$index)
{
array_splice($db_array,$index,1);
return $db_array;
}
/**
* Обновить запись в БД полностью 
* @param array $db_update Что заменять
* @param array $db_array Где заменять
* @param integer $index Индекс записи
* @param boolean $reverse Реверс массива
* @param string $separator разделитель
* @return array
*/
function update($db_update,&$db_array,$index,$reverse=false,$separator=':|:')
{
if($reverse): 
  $db_update=array_reverse($db_update,true); 
endif;
array_splice($db_array,$index,1,implode($separator,$db_update)."\r\n");
return $db_array;
}
/**
* Доступ к БД
* @param string имя БД
* @param string сласификатор БД
* @param integer доступ к БД
* @return boolean
*/
function chmod($path,$chmod=0777)
{
if(!$this->is_writable_ext($path)):
  @chmod($path,$chmod); 
  return true; 
else: 
  return false; 
endif;
}
/**
* Создание файлов ограничений
* @param string путь
*/
function access($path)
{
$fdb=fopen($path."/.htaccess",'wb');
fwrite($fdb,"DirectoryIndex index.php\r\n<Files *.*>\r\norder allow,deny\r\ndeny from all\r\n</Files>",80);
fclose($fdb);
$this->chmod($path."/.htaccess",0644);
$fdb=fopen($path."/index.php",'wb');
$this->chmod($path."/index.php",0755);
fwrite($fdb,"<?php header('location:../index.php?x=error&amp;level=404'); exit;?>",64);
fclose($fdb);
}
//END class DB
}
?>
 
  • Нравится
Реакции: BACZ
Херня какая-то. Все делается намного проще.
 
PHP:
<?php
$handle = fopen("/tmp/inputfile.txt", "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    echo $buffer;
}
fclose($handle);
?>
не то, мне нужно что то типа, с 10 строки до 100
как это релизовать? или как прочитать допустим 97 строку при условии что в фаиле их 100?
2 admLoki предложи лучше, ну если не сложно, или если не код, то фоть концепцию
 
А не хотите прочитать весь файл в массив, и по индексу обратиться к нужным строкам?



count($yy) - это если до конца, а можно до 100, а можно еще как нибудь. $i = 10 - это с какой позиции начинать.

А вывести 97-ю к примеру можно будет так: echo $yy[97];
 
А не хотите прочитать весь файл в массив, и по индексу обратиться к нужным строкам?

*** скрытое содержание ***

count($yy) - это если до конца, а можно до 100, а можно еще как нибудь. $i = 10 - это с какой позиции начинать.

А вывести 97-ю к примеру можно будет так: echo $yy[97];
не то ибо читайте пост топик стартера. переполнение памяти соответственно и чрезмерно большой массив бу.
Вообще не рационально использовать настолько большие файлы.
Код:
<?php 
$m = 1;
$k = 10; //Строка с которой нам надо начать чтение
$end  = 100; //Последняя требуемая нам строка
$handle = fopen("/tmp/inputfile.txt", "r"); 
while (!feof($handle)) { 
    $buffer .= fgets($handle, 4096); 
    if($m<$k) {$buffer = ''; unset($buffer);}
    elseif($m>$end) break;
     $m++;
} 
fclose($handle); 
?>
 
2 virtualbrest
ваш вариант, мх... у меня так и реализовано!))
2 Deller дасоглаен, большие фаилы не есть, гуд, с трудом себе предстаавлю 8 000 новостей в обном фаиле))) каждаи из которых должна быть 2-3 кб))

спасибо хорошая идея, но только unset ну нужно делать, тк переменная уничтожается и потом создается, не есть гуд))) в остально верно))
------
эту идео уже бросли, создал кучу фаилов для каждой записи, много зато все маленькие, только теперь придется писать updater для перехода но новуюс структуру базы))
 
2 virtualbrest
ваш вариант, мх... у меня так и реализовано!))
2 Deller дасоглаен, большие фаилы не есть, гуд, с трудом себе предстаавлю 8 000 новостей в обном фаиле))) каждаи из которых должна быть 2-3 кб))

спасибо хорошая идея, но только unset ну нужно делать, тк переменная уничтожается и потом создается, не есть гуд))) в остально верно))
------
эту идео уже бросли, создал кучу фаилов для каждой записи, много зато все маленькие, только теперь придется писать updater для перехода но новуюс структуру базы))
Рациональнее етот файл бить на несколько. И рапределять по папкам (тематикам) тады, при чтении дирректории не бу неприятной нагрузки и читать бу проще без вот подобного траха моска.
 
когда память закончится, т.к. фаил будет больше чем объем памяти, то будет фатал ерор
как сделать так что бы фаил читался, скажем с определнной позиции допустим со строки 30 до 50
при условии что длина строки не известна!

$db_array=file($this->path($mod,$ext));

ниже прилигаю свой класс данных

для крайних случий

PHP:
ini_set("memory_limit", "528M");
 
Есть тут и еще один нюанс, который могу подсказать. Была у меня одна гостевая, на файлах (давно), в которой все писалось в один файл. Туда нафлудили роботы всякой ерунды, а я не мог понять, куда убегает мой трафик у хостера. оказалось, он считает каждую загрузку этого файла за трафик полностью, даже если просто он читался и ничего не выводилось на экран (в связи с каким-то фильтром). Другими словами, все же старайтесь оптимизировать процесс, будет кушать ведрами трафик.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху