Снова фаилы

Тема в разделе "PHP", создана пользователем CrashX, 18 окт 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    существует проблема


    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 нравится это.
  2. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Херня какая-то. Все делается намного проще.
     
  3. Alek$

    Alek$ Постоялец

    Регистр.:
    24 сен 2008
    Сообщения:
    63
    Симпатии:
    25
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    PHP:
    <?php
    $handle 
    fopen("/tmp/inputfile.txt""r");
    while (!
    feof($handle)) {
        
    $buffer fgets($handle4096);
        echo 
    $buffer;
    }
    fclose($handle);
    ?> 
    не то, мне нужно что то типа, с 10 строки до 100
    как это релизовать? или как прочитать допустим 97 строку при условии что в фаиле их 100?
    2 admLoki предложи лучше, ну если не сложно, или если не код, то фоть концепцию
     
  5. virtualbrest

    virtualbrest

    Регистр.:
    6 май 2007
    Сообщения:
    210
    Симпатии:
    18
    А не хотите прочитать весь файл в массив, и по индексу обратиться к нужным строкам?



    $yy = file ("price.txt");
    for($i=10; $i < count($yy); $i++)
    { echo $yy[$i]; }



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

    А вывести 97-ю к примеру можно будет так: echo $yy[97];
     
  6. Deller

    Deller Создатель

    Регистр.:
    24 фев 2008
    Сообщения:
    34
    Симпатии:
    16
    не то ибо читайте пост топик стартера. переполнение памяти соответственно и чрезмерно большой массив бу.
    Вообще не рационально использовать настолько большие файлы.
    Код:
    <?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); 
    ?>
    
     
  7. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    2 virtualbrest
    ваш вариант, мх... у меня так и реализовано!))
    2 Deller дасоглаен, большие фаилы не есть, гуд, с трудом себе предстаавлю 8 000 новостей в обном фаиле))) каждаи из которых должна быть 2-3 кб))

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

    Deller Создатель

    Регистр.:
    24 фев 2008
    Сообщения:
    34
    Симпатии:
    16
    Рациональнее етот файл бить на несколько. И рапределять по папкам (тематикам) тады, при чтении дирректории не бу неприятной нагрузки и читать бу проще без вот подобного траха моска.
     
  9. DIAgen

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    для крайних случий

    PHP:
    ini_set("memory_limit""528M");
     
  10. virtualbrest

    virtualbrest

    Регистр.:
    6 май 2007
    Сообщения:
    210
    Симпатии:
    18
    Есть тут и еще один нюанс, который могу подсказать. Была у меня одна гостевая, на файлах (давно), в которой все писалось в один файл. Туда нафлудили роботы всякой ерунды, а я не мог понять, куда убегает мой трафик у хостера. оказалось, он считает каждую загрузку этого файла за трафик полностью, даже если просто он читался и ничего не выводилось на экран (в связи с каким-то фильтром). Другими словами, все же старайтесь оптимизировать процесс, будет кушать ведрами трафик.
     
Статус темы:
Закрыта.