Strict Standards: Resource ID#29 used as offset, casting to integer (29) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#31 used as offset, casting to integer (31) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#32 used as offset, casting to integer (32) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Технический вопрос
ТвойWeb » » ExBB - лучший форум на файлах » Технический вопрос

Страниц (1): [1]
 

1. SKIF - 22 Апреля, 2006 - 03:52:32 - перейти к сообщению
Хотелось бы в общих чертах понять какой алгоритм сохранения (и чтения из них) массивов в текстовых файлах и ньюансы. (т.е. каким образом скрипт получает из текстового файла exBB массив переменных).

Возьмем, к примеру, файлы папки members.


используется там функция explode() или нет?


pps. хотелось бы конечно побольше про тонкости этого механизма, если есть. Очевидные моменты я и сам из кода увижу.
2. TvoyWeb - 22 Апреля, 2006 - 04:15:14 - перейти к сообщению
SKIF
Я где-то уже описывал этот механизм. В файлы сохраняются строка получаемая в результате серилизации ( http://php.net/serialize), а когда читаются данные то строка превращается обратно в массив функцией unserialize().
Все очень просто.
3. SKIF - 22 Апреля, 2006 - 04:26:48 - перейти к сообщению
а вот в CMS LIMBO это делается примерно так
CODE:

foreach ($vars as $i){
fwrite($file, $i."\n");
}


соответственно читаются в массив вызовом ф-ии file().... Единственный минус это то, что перед сохранением приходится удалять все входы "\n" .

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

ps. если глупость написал, прошу ничем не кидаться =))) просто думаю, что лучше использовать для себя или 1 или 2...
4. TvoyWeb - 22 Апреля, 2006 - 06:10:58 - перейти к сообщению
SKIF пишет:
Единственный минус это то, что перед сохранением приходится удалять все входы "\n" .

Это не единственный минус.
Теперь смотри у тебя есть массив:
CODE:
Array
(
[cat] => Сайтостроительство
[cid] => 1
[name] => Общие вопросы
[posts] => 2538
[top] => 294
[pos] => 101
[sts] => all
[cod] => 1
[up] => 102400
)

Чтобы записать его в файл потребуется только функция serialize, в результатом которой будет строка:
CODE:
a:9:{s:7:"cat";s:18:"Сайтостроительство";s:5:"cid";i:1;s:4:"name";s:13:"Общие вопросы";s:5:"posts";i:2538;s:6:"top";i:294;s:8:"pos";i:101;s:6:"sts";s:3:"all";s:5:"cod";b:1;s:6:"up";i:102400;}

Чтобы вернуть массив достаточно сделать unserialize, и мы можем обращаться к элементам массива по их именнованным ключам. Также эта функция позволяет сохранять вложенные масивы (многомерные) чего нельзя добиться используя file в купе с другими функциями.

В варианте с file, ты должен все эти данные разграничить неким символом функцией implode (или подобной), в последствии, после обратного чтения из файла и разбиения строки на элементы массива (explode) ты сможешь обращаться к элементам такого массива только по их числовым ключам.
Плюс serialize еще и в том что он сохраняет типы переменных. Если ты объявил переменную в FALSE, то после unserialize эта переменная будет именно FALSE, а не 0. То есть сохранится ее тип (boolean).

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

ИМХО file годится для небольших данных.
5. SKIF - 22 Апреля, 2006 - 07:18:42 - перейти к сообщению
классно, спасибо за консультацию =)
6. TvoyWeb - 22 Апреля, 2006 - 08:53:39 - перейти к сообщению
Здесь вот ETC сказал, что переводы строк не играют никакой роли в серилизации. То есть их не надо удалять или изменять. Я проверил и вроде действительно так и есть.
Но у меня с этим как то был глюк и стех пор я убираю переводы строк перед упаковкой массива.

Но я еще выясню, может это как то зависит от настроек сервака.

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0527]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33