PHP + FILE BD @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
На страницу 1 2  >  Страница 1 из 2 [ Сообщений: 41 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Заголовок сообщения: PHP + FILE BD
Сообщение Добавлено: 19 Февраль 2004, 12:49:58 
Возник вопрос по скорости и удобству...

есть текстовая база новостей

id|заголовок|текст|счетчик просмотров
1|заг1|текст1|0
2|заг2|текст2|2
3|заг3|текст3|5
4|заг4|текст4|0

читаю построчно и вывожу к примеру только заголовки с указанием количества просмотров.

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

впорос в чем, как будет быстрее и надежнее (так как в php flock из рук вон плох), хранить счетчики? может стоит их вынести для каждого id в отдельный файл? типа id.count
но тогда при показе кратких (заголовок кол-во просмотров) прийдется для каждой новости перечитывать каждый файл!

что вы думаете по этому поводу?

mysql не предлогать :)

_________________
:: metal kick ass ::
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 19 Февраль 2004, 13:10:59 
MpaK999, имхо, логичнее было бы вообще каждую новость и счтетчик в отдельном файле держать, а заголовки пусть в другом будут. таким образом ты уменьшишь вероятность одновременной попытки изменить значение счетчика.

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 19 Февраль 2004, 13:16:04 
Long, логичнее, но дублирование заголовков как-то не то...
да и все равно при показе заголовков все равно будет читаться каждый счетчик, это сильно медленно на пхп? (file)

_________________
:: metal kick ass ::
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 19 Февраль 2004, 14:28:08 
либо я чего-то не понимаю, либо одно из двух...
у тебя есть файл с заголовками новостей формата
id|заголовок
и есть набор файлов с новостями. где на первой строке стоит счетчик просмотров, а со второй строки идет текст самой новости.

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 19 Февраль 2004, 14:31:21 
MpaK999, а не пробовал сделать через dBase functions или dbm functions, т.е. через базу данных, которая в файле лежит?
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 19 Февраль 2004, 15:00:17 
Long, все равно ведь при показе к примеру списка заголовков новостей по формату крый ты предлогаешь
надо прочитать файл со всеми заголовками
выводить по одной при этом открывая и читая файл со счетчиком (чтобы показать Новость (читали: 5 раз))
и т.д.

не долго ли это?

_________________
:: metal kick ass ::
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 19 Февраль 2004, 15:08:20 
@TSV, на сколько я понимаю, это не решит проблему со счетчиком. и не факт, что на такой простой задаче будет работать быстрее. и потом, надо чтобы хостинг поддреживал dBase

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 19 Февраль 2004, 15:09:56 
MpaK999, ты должен отображать значение счетчика при показе заголовка?

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 19 Февраль 2004, 15:13:48 
Long, очень желательно.

я просто думаю, как будет лучше сделать (по скорости и удобству), чтобы счетчик лежал в общем файле новостей (к примеру) или отдельно...

_________________
:: metal kick ass ::
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 19 Февраль 2004, 15:14:09 
Long, почему - не решит проблему со счетчиком? dBase, подумамши, я действительно из списка вычеркиваю. Ну а DB2? Которая базу в просто в файле держит к тому же. У нее-то проблем со скоростью, в общем-то нету никаких.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 19 Февраль 2004, 15:14:27 
в 1ом случае сомнение во flock
во 2ом скорость чтения счетчиков для каждой новости

_________________
:: metal kick ass ::
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 19 Февраль 2004, 15:14:37 
MpaK999, как говорилось в одном анекдоте - точнее надо было формулировать задачу...

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 19 Февраль 2004, 15:22:49 
сразу же написал "читаю построчно и вывожу к примеру только заголовки с указанием количества просмотров." см. первый пост

_________________
:: metal kick ass ::
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 20 Февраль 2004, 14:28:29 
Проверил. Данная задача изумительно хорошо и просто (и быстро по скорости) решается через dbm Functions - abstraction layer для баз данных key=>value (i.e. Беркли DB). С самыми разными handlers, что ndbm, что db2 далее везде.

Таблицы titles(id=>title), news(id=>content), counters(id=>counter).
:gent:
Exil Муж.
соучастник
0
Сообщения: 396
Зарегистрирован: 17.01.04
Сообщение Добавлено: 20 Февраль 2004, 17:35:56 
советую не маяться с текстами типа значение :: значени1 1
если уже и делаешь на текстовых - массив сериализованый- самое то.. намного меньше проблем с записью значени й счетчика, замене значений из под скрипта.. и никакого геморроя с добавлением новых значений.

_________________
Точки зрения ограничены, и поэтому всегда ведут к конфликту. © Джидду Кришнамурти
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 24 Февраль 2004, 12:02:36 
@TSV, у dbm вроде зависимость от платфоры есть, размер базы...

_________________
:: metal kick ass ::
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 24 Февраль 2004, 13:42:31 
MpaK999, нету у нее такой зависимости. :) И, строго говоря, dbm - это даже не база, dbm - это абстракция, интерфейс доступа, который полностью закрывает от тебя реализацию. Бинарные файлы базы, вероятнее всего, не будут переноситься. Но ведь тебя никто и не заставляет переносить именно бинарные файлы. ;)
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 24 Февраль 2004, 16:19:11 
"Размер, количество и вид ключей и значений в DBM-базе данных ограничены. "

отсюда взято - http://webmaster.yartop.ru/progr/perl/p … 07-21.html

ну и вообще, отходим от темы... хотел бы базу использовал бы MySQL, так ведь вопрос в другом... как хранить эти счетчки, как удобнее и быстрее???

_________________
:: metal kick ass ::
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 24 Февраль 2004, 19:37:38 
MpaK999,
Цитата:
Проверил. Данная задача изумительно хорошо и просто (и быстро по скорости) решается через dbm Functions - abstraction layer для баз данных key=>value (i.e. Беркли DB). С самыми разными handlers, что ndbm, что db2 далее везде.

Таблицы titles(id=>title), news(id=>content), counters(id=>counter).


Не отходим. ;) Это быстрее и MySQL, и текста. ;)
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 25 Февраль 2004, 14:02:46 
@TSV, ок, быстро... но как бы с flock (DBM как я понял сам за этим следит?) и с ограничением на размер?

_________________
:: metal kick ass ::
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 25 Февраль 2004, 14:14:34 
MpaK999,
- следит сам
- у DBM нету ограничения на размер. ;) Точнее есть, но точное такое же, как и у любой строки PHP, то есть тебя волновать не будет в любом случае. Дело в том, что dbm - это abstraction layer, интерфейс, который вызывает уже реальные функции той базы, которая у тебя установлена (читай - прикомпилена к PHP).
Код:
db
ndbm support enabled

dba
DBA support  enabled 
Supported handlers  ndbm cdb cdb_make inifile flatfile

Смотри разделы db и dba в выдаче phpinfo(); Handlers бывают разные, у подавляющего большинства ограничения весьма гуманные. Но за все, конечно, поручиться нельзя. Зато можно легко проверить. Затолкай в тестовую базу пару key=>value, у обоих задай большую длину. Затем вытащи обратно и сравни. :gent:

А в той книжке, во-первых, написано про Perl, во-вторых, автор так четко и ясно назвал ограничения, как будто бы у всех одинаковые handlers стоят. :laugh: Смех и грех.

Примечательный факт - Илья Сегалович (один из разработчиков Yandex) не так давно обмолвился на форуме Yandex, что они перестали использовать собственноручно написанную базу для хранения индексов, и пересели на Berkley DB. По нашему, по-бразильски, это интерфейс dbm к handler DB2. Ограничений не забоялись, что харАктерно. Неужели у тебя объемы информации больше, чем у Yandex. ;)
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 25 Февраль 2004, 15:12:45 
@TSV, ок, все же убедил, что 4 гигов базы мне разумеется хватит :)

но вопрос не стоит переходить с текстов или нет на DBM

вопрос в другом... (см. начало)

где хранить счетчики просмотров (новостей, статей, фотографий и т.п.), в общем файле (опасность плохого flock), но быстро когда выводишь заголовок и счетчик...

или же в каждый в отдельном файле, flock не страшен, но при выводе заголовков, для каждого надо читать его файл со значением счетчика, чтобы показать это.…


ТАК КАК ЖЕ ВСЕ? :confused:

_________________
:: metal kick ass ::
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 25 Февраль 2004, 15:22:09 
MpaK999, уточняющий вопрос - т.е. именно только с использованием просто текстовых файлов, никакую базу ты использовать не хочешь. ТОЧНО? :gent:
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 25 Февраль 2004, 15:27:38 
@TSV, так точно :)

_________________
:: metal kick ass ::
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 25 Февраль 2004, 15:36:32 
MpaK999, :!: О! Тогда используй счетчик как часть имени файла. ;)
- Имя файла <NNN>.<дата>.<время>. <счетчик>.txt - новость
- При увеличении счетчика делаем просто rename()
- В файле первая строка - заголовок, остальное - сама новость
- При выводе списка новостей получаем список из имени файла и его первой строчки
- Никаких lockов и в помине нету. Только нужно вызывать @rename().
:glasses:
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 25 Февраль 2004, 15:50:00 
@TSV, идея прикольная...
а как узнавать имена файлов (opendir)? тогда как им задавать порядок - сортировать по <NNN>?

_________________
:: metal kick ass ::
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 25 Февраль 2004, 15:50:01 
@TSV, а как определять имя файла в текущий момент?

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 25 Февраль 2004, 16:47:24 
MpaK999, - opendir(), сортировать по <NNN>, у меня, кстати, сделано без счетчика, а просто дата и время составляют часть имени файла, по ним и сортирую. Но не суть. ;) Как хошь, так и сортируй.
Long, - chdir($newsdir); glob(<имя файла с '*' вместо счетчика>) ;)
MpaK999, а можно и просто
Код:
chdir($newsdir); foreach (glob("*.txt") as $filename) { … }

:gent:
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 25 Февраль 2004, 16:52:51 
MpaK999, важная инфа насчет glob():

Цитата:
glob
(PHP 4 >= 4.3.0)
glob -- Find pathnames matching a pattern
Description
array glob ( string pattern [, int flags])
The glob() function searches for all the pathnames matching pattern according to the rules used by the shell. No tilde expansion or parameter substitution is done.
Returns an array containing the matched files/directories or FALSE on error.

Note: Before PHP 4.3.3 GLOB_ONLYDIR was not available on Windows and other systems not using the GNU C library.


http://www.php.net/manual/en/function.glob.php
Второе тебя, скорее всего, волнует меньше, а первое - существенно.
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 25 Февраль 2004, 16:58:55 
думаю, что еще должно волновать
Цитата:
This function is disabled in safe mode


_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 25 Февраль 2004, 17:02:49 
Long, но ведь это бывает все-таки редко. ;) Не все ж провайдеры такие звери. :laugh: :gent:
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 25 Февраль 2004, 17:04:30 
хорошая идея... сегодня сделаю пару тестов на скорость...

_________________
:: metal kick ass ::
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 25 Февраль 2004, 17:05:09 
@TSV, не скажи, точной статистики не знаю, но предполагаю, что больше половины ставит сейфмод. (тот же SiteHotel)

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 26 Февраль 2004, 12:25:04 
вчера за пару минут сделал тестовые скрипты.…

база 1359 записей, гонял по 10000 раз, потом взял среднее время работы...

разница между вариантами счетчик внутри и счетчик снаружи - 01.0967519 и 01.11027661

тест - http://mpak.bestweb.ru/des/test.rar - 100Kb
возможно он и не совсем корректный...

очень, сорри.. поправил урл

_________________
:: metal kick ass ::


Последний раз редактировалось MpaK999 26 Февраль 2004, 14:18:10, всего редактировалось 2 раз(а).
@TSV
постоянный участник
11
Сообщения: 4736
Зарегистрирован: 08.05.03
Сообщение Добавлено: 26 Февраль 2004, 12:29:27 
MpaK999, 404 not found. :frown:
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
На страницу 1 2  >  Страница 1 из 2 [ Сообщений: 41 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100