Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пишем класс для работы с файлами как с бд, дружненько ! 
:(
    Опции темы
IZ@TOP
  Дата 17.4.2003, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Вот собственно я решил что надоб написать класс который позволял бы работать с файлами как с базами данных - то есть что бы можно было добавлять изменять, ну и желательно что бы этот класс можно было применить в любом деле, допустим: хочу гостевую сделать без бд - пожалуйста, формат хранения такойто, и вовод тоже, захотел новости - пожалуйста записываем через класс и получаем массив из него же .... думаю я понятно мысль свою обяснил ? Нет ? Да?

Я начну (чуть позже) а вы там пока подумайте biggrin.gif

--- да, и, чуть было не забыл: все с обильными вразумительными комментариями ---

Это сообщение отредактировал(а) Iz@top - 17.4.2003, 08:58


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
IZ@TOP
  Дата 17.4.2003, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Значит так: вот кое что что я тут надумал ... Вы тож тама не спите !
Код


/**************************************************************
** Класс по работе с файлами -
** запись в файл с определением формата, извлечение хранимой в
** файлах информации и помещения ее в массив.
*///***********************************************************

#------- переменные определяемые внутри класса class fdb ------

       $db_dir; # определяет каталог в котором хранится файл с данными (пример: $db_dir = “file_db/”;)
       $db_name; # определяет имя файла который будет обрабатываться (пример: $db_name = “db.db”;)
       $save_data; # если будет использоваться функция записи данных то эта переменная будет хранить
       # записываемую информацию
       $exp = "]%["; # тут хранится разделитель с помощью которого разделяются записываемые переменные
       # (по умолчанию ']%[' )
       $format; # формат массива возвращаемого функцией
       $db; # массив данных (на подобие возвращаемого select’ом в дб)
       $_error; # в этой переменной будут записаны массивом все ошибки

#------- функция загрузги массива данных из файлов ------------

       function load_fdb() {
               if(empty($this->db_dir)) { $this->_error[] = "<b class=error_status>fatal error:</b> 
               <i class=error_name>не определено
               значение каталога {\"\$this->db_dir\"}</i>"; } # я надеюсь что тут все понятно !
               if(empty($this->db_name)) { $this->_error[] = "<b class=error_status>fatal
               error:</b> <i class=error_name>не определено имя файла {\"\$this->db_name\"}</i>"; }
               else if(file_exists($this->db_dir.$this->db_name)) { $this->_error[] = "
               <b сlass=error_status>fatal error:</b> <i class=error_name>
               не могу найти файл {\"".$this->db_dir.$this->db_name."\"}</i>"; } # и здесь тож ...
               # ну вроде с фатал еррорами закончил
               if(empty($this->_error)) {

                       $line = file($this->db_dir.$this->db_name);

                       // ... а вот тут кто предложит лучший вариант обработки файла ? по всей видимости
                       будем использовать функцию explode() ?

               } else {

                       // ... тут мы с еррорами разбираемся

               }
       }



baaa.gif

Это сообщение отредактировал(а) Iz@top - 17.4.2003, 12:48


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
IZ@TOP
Дата 18.4.2003, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



ЭЭЭ, народ, Вы тама как ? Уснули что ли ?((((((


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
arial
  Дата 18.4.2003, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



Iz@top, вот я для новостей и гостевухи заготовил небольшой класс, он близок к твоей теме.
Он предназначен для того, чтобы строки в прочитанном в массив файле разбить на составляющие.
По порядку.
У меня файл вида:

1|arial|data
2|iz@top|data
...
N|XXX|data

Читаем его в массив функцией file()
Получаем :

array[0]="1|arial|data"
array[1]="2|iz@top|data"
и т.д.

Так вот этот маленький простенький класс призван разбить каждый элемент этого массива на подэлементы, короче сделать двухмерный массив.
Код
<?
class expstr {                                                               //От explode string (я не поэт, я не прозаик)
var $str_array;                                                    // То что получаем после выполнения ф-ии (массив)
function exp_str ($string,$razd) {                       // (Строка,Разделитель)
 $this->str_array=array();
 $def_razd="|";                                            //Разделитель по умолчанию
 if (empty($razd)) $razd=$def_razd;
 $string=trim($string);
 $this->str_array=explode($razd,$string);   //Взрываем по разделителям в новый массив
}
}
?>


У меня работает прекрасно.
Хоть под новости, хоть под гостевуху.

А по поводу записи новых строк в файл, я за запись в конец файла "a". Я раз я обжогся. Алгоритм у одного умника взял (типа читаем файл в переменную, очищаем файл, записываем новое значение в начало файла, дописываем старые сообщения из переменной после нового сообщения), вся гостевуха улетела, сколько смог восстановил из бакапа, а код переделал по своему. Пишу всегда в конец файла, а когда читаю, переворачиваю массив array_reverse () и новые сообщения оказываются в верху.

Больше меня волнует вопрос, как править отдельные строки, или удалять их.
Сдесь не обойтись без того, чтобы не читать весь файл в массив, а потом работать с ним. И если какой то сбой во время записи массива обратно в файл то ...

Здесь мне в голову пришла кой какая идея, но я ее еще не развивал:
Надо иметь два файла с одинаковым содержимым (главный и резервный).
Когда мы произвели какие то действия над главным файлом и операция прошла успешно, содержимое главного файла копируется в резервный.
Если же произошла какая то ошибка в процессе записи в главный файл, резервный файл копирует свое содиржимое в главный. Появляется хоть какая то защита данных от безвозвратной утраты.
Но как эту проверку сделать (нормально или нет прошла перезапись файла) надо думать.


p.s.

Iz@top, ты прав, что то тихо как на форуме...
notify.gif


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
Wowa
Дата 19.4.2003, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 1
Всего: 290



Цитата
Iz@top, ты прав, что то тихо как на форуме...

раздел PHP на форуме еще не так популярен, как остальные, но совместными усилиями мы добъемся его популярности!
PM WWW   Вверх
IZ@TOP
Дата 21.4.2003, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Все, додумался я как сделать:
Код

      function load_fdb() {
              if(empty($this->db_dir)) { $this->_error[] = "<b class=error_status>fatal error:</b>
              <i class=error_name>не определено
              значение каталога {\"\$this->db_dir\"}</i>"; } # я надеюсь что тут все понятно !
              if(empty($this->db_name)) { $this->_error[] = "<b class=error_status>fatal
              error:</b> <i class=error_name>не определено имя файла {\"\$this->db_name\"}</i>"; }
              else if(file_exists($this->db_dir.$this->db_name)) { $this->_error[] = "
              <b сlass=error_status>fatal error:</b> <i class=error_name>
              не могу найти файл {\"".$this->db_dir.$this->db_name."\"}</i>"; } # и здесь тож ...
              # ну вроде с фатал еррорами закончил
              if(empty($this->exp)) { $this->exp = "|"; }
              if(empty($this->_error)) {

                      $line = file($this->db_dir.$this->db_name);
                      $i = 0;
                      $c = count($line);
                      while($i < $c) {
                          $etmp = explode($this->exp,$line[$i]); // Разбиваем строку $line в массив
                          $ec = count($etmp); // возвращаем количество ключей в массиве $line
                          $ei = 0;
                          if($ei < $ec) { // проверка - если не достигнут конец массива $etmp
                               $this->db[$i][$ei] = $etmp[$ei]; // то его следующий индекс добавляется
                               // добаляется в $db (ассоциативный массив) ... думаю тут понятно ...
                               $ei++;
                          } else {
                               unset($etmp);
                               $i++;
                          }
                      }
              } else {

                      // ... здесь особой важности нет

              }
      }


Если чего кому не понятно - спрашивайте, а я пока подумаю над сохранением в базе данных ...


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
IZ@TOP
Дата 21.4.2003, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



То есть тут не зависимо от формата записи (будь то date|name|email|message|ip|icq|aol|yahoo|status или date|news|author) будет происходить загрузка каждого значения, надо только знать в какой последовательности все это хранится в $db ... smile.gif


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
arial
  Дата 21.4.2003, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



Вот этот кусок:
Код
if(empty($this->_error)) {
       $line = file($this->db_dir.$this->db_name);
       $i = 0;
       $c = count($line);
       while($i < $c) {
              $etmp = explode($this->exp,$line[$i]); // Разбиваем строку $line в массив
              $ec = count($etmp); // возвращаем количество ключей в массиве $line
              $ei = 0;
              if($ei < $ec) { // проверка - если не достигнут конец массива $etmp
                     $this->db[$i][$ei] = $etmp[$ei]; // то его следующий индекс добавляется
                     // добаляется в $db (ассоциативный массив) ... думаю тут понятно ...
                     $ei++;
               }
        }

предлагаю сделать элегантнее:
Код
if(empty($this->_error)) {
$line=file($this->db_dir.$this->db_name);
for($i=0;$i<count($line);$i++) {
     $etmp=explode($this->exp,$line[$i]);
     for($ei=0;$ei<count($etmp);$ei++) $this->db[$i][$ei]=$etmp[$ei];
}
}


А вообще меня волнует вопрос, а если эта база вырастет до больших размеров (больше 5Мб), как она ворочатся будет?


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
IZ@TOP
Дата 22.4.2003, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Цитата
предлагаю сделать элегантнее:
CODE
if(empty($this->_error)) {
$line=file($this->db_dir.$this->db_name);
for($i=0;$i<count($line);$i++) {
    $etmp=explode($this->exp,$line[$i]);
    for($ei=0;$ei<count($etmp);$ei++) $this->db[$i][$ei]=$etmp[$ei];
}
}

Боюсь мой друг что проблема в том что цикл while работает быстрее чем for ... но если хочеш можеш проверить что быстрее, если тебя не затруднит, просто я щас на работе, а здесь у меня апача с рнр не стоит ...
Цитата
А вообще меня волнует вопрос, а если эта база вырастет до больших размеров (больше 5Мб), как она ворочатся будет?

И это тоже можно проверить опытным путем .... smile.gif


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Mark.dll
Дата 22.4.2003, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 28.2.2003
Где: Эстония, Нарва

Репутация: нет
Всего: нет



Создавайте новую файл с базой, если filesize >= 5mb
--------------------
"I wish I could change the world..."
PM MAIL WWW ICQ   Вверх
Sardar
Дата 22.4.2003, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Если подгружать файл целиком то есть возможность потери данныx sad.gif .
Лучше всего соxранять данные в отдельном файле, а затем пользоватся смещениями, xранимыми в другом файле для доступа к данным.
Удаляя данные ты удаляешь ссылку на ниx. Если нечаянно удалить сообщение то его можно всегда востановить. Изменяя данные ты просто запишешь иx в конец файла данныx подредактировав ссылку.
Такая организация физически устойчива к ошибкам. Правда, время от времени придется дефрагментировать файл данныx exclamation.gif .

Завтра пришлю сюда пример-класс читающий записи гостевой книги. wink.gif

Если руки не кривые то допустить какую либо ошибку не возможно rolleyes.gif .


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
IZ@TOP
Дата 22.4.2003, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Цитата
Изменяя данные ты просто запишешь иx в конец файла данныx подредактировав ссылку

Зачем в конец ? Можно сразу туда куда надо:
Код

        if($user_password == $confirm_user_password and $dbs[$i]['password'] == $user_password) {
         $dbs[$i]['status'] = $lock_stat;
         $dbs[$i]['user'] = $user_name;
         $dbs[$i]['password'] = $user_password;
         $dbs[$i]['name'] = $name_stat;
         $dbs[$i]['url'] = $url_stat;
   trim($dbs[$i]['comment']);
   ereg_replace("\n\r"," ",$dbs[$i]['comment']);
         $dbs[$i]['comment'] = $comment_stat."\n";
         
   $fop = fopen($db_directory.$db_file,"w");
   fclose($fop);
   $fop = fopen($db_directory.$db_file,"a+");
   $p = 0;
         while($p < count($dbs)) {
    fputs($fop,$dbs[$p]['uid']."]%[".$dbs[$p]['user']."]%[".$dbs[$p]['password']."]%[".$dbs[$p]['status']."]%[".$dbs[$p]['name']."]%[".$dbs[$p]['url']."]%[".$dbs[$p]['comment']);
          $p++;
         }
   fclose($fop);          
   if($cookie_time == "member") {
          $cookie_password_time = time()+360000*24;
         }
         setcookie($statistic_name_cookie_password,$user_password,$cookie_password_time);
        }



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
arial
  Дата 22.4.2003, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



Цитата(Iz @ 22.4.2003, 09:14)
Боюсь мой друг что проблема в том что цикл while работает быстрее чем for ...

Да...
Согласен. confused.gif


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
Sardar
Дата 23.4.2003, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Елки что делаем smile.gif smile.gif smile.gif ? Отказобезопасный способ работы с данными или просто один из милионов скриптов на эту тему.
Если подгрузить весь файл и затем записать его, то можешь быть одним из счастливчиков кого обломали на самом интересном месте. Все данные будут утеряны.
Код

//подгрузили
$fp=fopen('die.txt','w'); //содержимое обнулилось
fwrite($fp,$data); //буффер у нас большой, так что не все успели записать
//здесь облом
fclose($fp);


Вот что я имел в виду:


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sardar
Дата 23.4.2003, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Код

<?php
/**
* Класс просмотрщик файла записей книги.
*/
define("ADD_BOOKVIEW",TRUE);
if(!defined('PROCESS')) header('Location: ../index.php'); //Отсылаем чайников.
if(!defined('ADD_CONFIG')||empty($config)) trigger_error("Configuration not included",E_USER_ERROR);

class Bookview {

   var $offsets=array(); //массив со смещениями
   var $buffer=NULL; //загруженное сообщение
   var $source=NULL; //открытое соединение с файлом данных книги.
   var $index; //текущий индекс в сообщениях
   var $quantity=0; //количество сообщений в книге.
   var $error; //флаг что данные не доступны.
   var $_fully; //флаг что буффер заполнен.
   /**
    * Конструктор класса. Принимает аргументы первого сообщения и количества сообщений на одной
    * странице. Можно на прямую использовать $displ и $npage. Остальные настройки берет из конфигурации.
    * @param $from  -индекс первого сообщения, отсчет с нуля. (>=0)
    * @param $len   -количество сообщений в странице, 0=>все сообщения. (>0)
    * @param $orde  -способ четения: reverse(дефолт)-с конца, normal-сначала сообщений
    */
   function Bookview($from,$len=0,$orde='reverse') {
       global $config;
       $data=(isset($config['book_data']))? $config['book_data']: './data/data.dat';
       if(!is_file($data)||!is_readable($data)) trigger_error('Can\'t open data file',E_USER_ERROR);
       $offs=(isset($config['book_offsets']))? $config['book_offsets']: './data/offset.dat';
       if(!is_file($offs)||!is_readable($offs)) trigger_error('Can\'t open offsets file',E_USER_ERROR);
       $indw=(isset($config['book_index_width']))? $config['book_index_width']: 8;

       $this->quantity=filesize($offs)/$indw;
       $from=$from<0? 0: ($from>$this->quantity)? $this->quantity: intval($from);
       $max=$this->quantity-$from;
       $len=($len<=0||$len>$max)? $max: intval($len);
       if($len<1) {
           $this->error=TRUE;
           return;
       }
       //грузим
       $fp=fopen($offs,'r');
       flock($fp,LOCK_SH); //все читают, никто не пишет.
       if(!$fp) {
           trigger_error('Can\'t open offsets file',E_USER_ERROR);
           return;
       }
       if($orde=='normal') fseek($fp,$from*$indw,SEEK_SET);
       else fseek($fp,($this->quantity-$from-$len)*$indw,SEEK_SET);
       if($orde=='normal') {
           for($i=0; $i<$len; $i++) $this->offsets[]=intval(fread($fp,$indw));
       }
       else {
           for($i=$len-1; $i>=0; $i--) $this->offsets[$i]=intval(fread($fp,$indw));
       }
       flock($fp,LOCK_UN);
       fclose($fp);
       //data file
       $this->source=fopen($data,'r');
       if(!$this->source) {
           trigger_error('Can\'t open data file',E_USER_ERROR);
           return;
       }
       flock($this->source,LOCK_SH);
       $this->index=0;
       $this->_fresh(); //обновляем буффер
   }

   //------PUBLIC------------
   /**
    * Выдать запись. Подгрузит и выдаст следующюю запись. При ошибке возвратит FALSE.
    * @param $header -загрузить только заголовок.
    */
   function nextmsg($header=FALSE) {
       if($this->index<sizeof($this->offsets)) {
           $this->index++;
           $this->_fresh($header);
           if(!$this->error) return $this->buffer;
           else return FALSE;
       }
       return FALSE;
   }
   /**
    * Подгрузит и выдаст предидущюю запись. При ошибке возвратит FALSE.
    * @param $header -загрузить только заголовок.
    */
   function prevmsg($header=FALSE) {
       if(($this->index-1)>=0) {
           $this->index--;
           $this->_fresh($header);
           if(!$this->error) return $this->buffer;
           else return FALSE;
       }
       return FALSE;
   }
   /**
    * Выдаст текущюю запись. Если $reload=TRUE то перезагрузит ее.
    * @param $reload -перезагрузить запись
    * @param $header -загрузить только заголовок.
    */
   function currentmsg($reload=FALSE,$header=FALSE) {
       if($reload) $this->_fresh($header);
       if(!$this->error) return $this->buffer;
       else return FALSE;
   }
   /**
    * Поиск в загруженных записях. Негативное число - продвижение назад. 0 - перезагрузка.
    * Вызов без параметров возвратит текущую позицию указателя. В случае ошибки возвратит FALSE.
    * @param $step   -сдвинуть на позицию
    * @param $header -загрузить только заголовок.
    */
   function seek($step=FALSE,$header=FALSE) {
       if($step===FALSE) return $this->index;
       $newpos=$this->index+$step;
       $this->index=$newpos<0? 0: ($newpos>sizeof($this->offsets))? sizeof($this->offsets): $newpos;
       return $this->_fresh($header);
   }
   /**
    * Количество сообщений. Вызов без параметров возвратит количество подгруженных сообщений.
    * Передача FALSE параметром выдаст реальное количество сообщений. При ошибке даст FALSE.
    * @param $loaded -выдать число загруженных(доступных) сообщений
    */
   function countmsgs($loaded=TRUE) {
       if(!$this->source) return FALSE;
       if($loaded) return sizeof($this->offsets);
       else return $this->quantity;
   }
   /**
    * Поддержка интерфейса Iterator. Напарник для функции nextmsg(). Сообщает есть ли еще
    * не прочтенные записи.
    */
   function hasMoreMsgs() {
       return $this->index<sizeof($this->offsets);
   }
   /**
    * Деструктор класса. Закрывает все соединения и освобождает ресурсы.
    */
   function destroy() {
       if($this->source) {
           @flock($this->source,LOCK_UN);
           @fclose($this->source);
           $this->source=NULL;
       }
       $this->offsets=NULL;
       $this->buffer=NULL;
   }
   /**
    * Загруженно ли сообщение полностью. Возвратит: 0 - если сообщение не доступно, 1 - если
    * сообщение загруженно успешно, -1 - если был загружен только заголовок.
    */
   function loaded() {
       if($this->error) return 0;
       elseif($this->_fully) return 1;
       else return -1;
   }
   //------PRIVATE-----------
   /*
    * Обновляет буффер новыми данными из файла. При ошибке разбора выдаст E_USER_WARNING.
    * С параметром $header=TRUE подгрузит только заголовок сообщения.
    */
   function _fresh($header=FALSE) {
       if(!$this->source||$this->index>=sizeof($this->offsets)) {
           $this->error=TRUE;
           return FALSE;
       }
       fseek($this->source,$this->offsets[$this->index],SEEK_SET);
       $cthead=$content=$anhead=$antword=NULL;
       $step=0;
       $buff='';
       $errmsg='Message damaged at: '.$this->offsets[$this->index];
       while(!feof($this->source)) {
           do{
               $temp=fgets($this->source, 4096);
               $sign=substr($temp,0,3);
               if($sign=='ch:'||$sign=='ct:'||$sign=='ah:'||$sign=='an:') break;
               $buff.=$temp;
           }
           while(!feof($this->source));

           switch($step) {
           case 0:
               if($sign!='ch:') {
                   trigger_error($errmsg, E_USER_WARNING);
                   $this->error=TRUE;
                   return FALSE;
               }
               break;
           case 1:
               $cthead=$buff;
               if($sign!='ct:') {
                   trigger_error($errmsg, E_USER_WARNING);
                   if($header) break 2;
                   else {
                       $this->error=TRUE;
                       return FALSE;
                   }
               }
               break;
           case 2:
               $content=$buff;
               if($sign!='ah:') {
                   if($sign!='ch:'&&!feof($this->source)) trigger_error($errmsg, E_USER_WARNING);
                   break 2;
               }
               break;
           case 3:
               if($sign=='an:') {
                   $anhead=$buff;
                   break;
               }
               else {
                   trigger_error($errmsg, E_USER_WARNING);
                   break 2;
               }
           case 4:
               $antword=$buff;
               break 2;
           }
           $buff=substr($temp,3);
           $step++;
           if($header&&$step==2) break;
       }
       $this->buffer=NULL;
       $this->buffer['cthead']=explode('|:|',$cthead);
       if(!empty($content)) $this->buffer['content']=$content;
       if(!empty($anhead)&&!empty($antword)){
           $this->buffer['anhead']=explode('|:|',$anhead);
           $this->buffer['antword']=$antword;
       }
       $this->_fully=empty($header);
       $this->error=FALSE;
       return TRUE;
   }


}
?>

Класс писал для гостевой, но в принципе он подойдет (с небольшими переделками) для любой задачи.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.5831 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.