читаю построчно и вывожу к примеру только заголовки с указанием количества просмотров.
далее если пользователь жмет подробнее, то открываю уже текст и увеличиваю кол-во просмотров, но для этого порой приходиться перечитываться весь файл, искать нужный id у него менять кол-во просмотров и опять писать все обратно.
впорос в чем, как будет быстрее и надежнее (так как в php flock из рук вон плох), хранить счетчики? может стоит их вынести для каждого id в отдельный файл? типа id.count
но тогда при показе кратких (заголовок кол-во просмотров) прийдется для каждой новости перечитывать каждый файл!
17 Сообщения: 4362 Зарегистрирован: 25.04.01 Откуда: Москва
Добавлено: 19 Февраль 2004, 13:10:59
MpaK999, имхо, логичнее было бы вообще каждую новость и счтетчик в отдельном файле держать, а заголовки пусть в другом будут. таким образом ты уменьшишь вероятность одновременной попытки изменить значение счетчика.
_________________ Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
Long, логичнее, но дублирование заголовков как-то не то...
да и все равно при показе заголовков все равно будет читаться каждый счетчик, это сильно медленно на пхп? (file)
17 Сообщения: 4362 Зарегистрирован: 25.04.01 Откуда: Москва
Добавлено: 19 Февраль 2004, 14:28:08
либо я чего-то не понимаю, либо одно из двух...
у тебя есть файл с заголовками новостей формата
id|заголовок
и есть набор файлов с новостями. где на первой строке стоит счетчик просмотров, а со второй строки идет текст самой новости.
_________________ Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
Long, все равно ведь при показе к примеру списка заголовков новостей по формату крый ты предлогаешь
надо прочитать файл со всеми заголовками
выводить по одной при этом открывая и читая файл со счетчиком (чтобы показать Новость (читали: 5 раз))
и т.д.
17 Сообщения: 4362 Зарегистрирован: 25.04.01 Откуда: Москва
Добавлено: 19 Февраль 2004, 15:08:20
@TSV, на сколько я понимаю, это не решит проблему со счетчиком. и не факт, что на такой простой задаче будет работать быстрее. и потом, надо чтобы хостинг поддреживал dBase
_________________ Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
Long, почему - не решит проблему со счетчиком? dBase, подумамши, я действительно из списка вычеркиваю. Ну а DB2? Которая базу в просто в файле держит к тому же. У нее-то проблем со скоростью, в общем-то нету никаких.
Проверил. Данная задача изумительно хорошо и просто (и быстро по скорости) решается через dbm Functions - abstraction layer для баз данных key=>value (i.e. Беркли DB). С самыми разными handlers, что ndbm, что db2 далее везде.
советую не маяться с текстами типа значение :: значени1 1
если уже и делаешь на текстовых - массив сериализованый- самое то.. намного меньше проблем с записью значени й счетчика, замене значений из под скрипта.. и никакого геморроя с добавлением новых значений.
MpaK999, нету у нее такой зависимости. И, строго говоря, dbm - это даже не база, dbm - это абстракция, интерфейс доступа, который полностью закрывает от тебя реализацию. Бинарные файлы базы, вероятнее всего, не будут переноситься. Но ведь тебя никто и не заставляет переносить именно бинарные файлы.
Проверил. Данная задача изумительно хорошо и просто (и быстро по скорости) решается через dbm Functions - abstraction layer для баз данных key=>value (i.e. Беркли DB). С самыми разными handlers, что ndbm, что db2 далее везде.
MpaK999,
- следит сам
- у DBM нету ограничения на размер. Точнее есть, но точное такое же, как и у любой строки PHP, то есть тебя волновать не будет в любом случае. Дело в том, что dbm - это abstraction layer, интерфейс, который вызывает уже реальные функции той базы, которая у тебя установлена (читай - прикомпилена к PHP).
Смотри разделы db и dba в выдаче phpinfo(); Handlers бывают разные, у подавляющего большинства ограничения весьма гуманные. Но за все, конечно, поручиться нельзя. Зато можно легко проверить. Затолкай в тестовую базу пару key=>value, у обоих задай большую длину. Затем вытащи обратно и сравни.
А в той книжке, во-первых, написано про Perl, во-вторых, автор так четко и ясно назвал ограничения, как будто бы у всех одинаковые handlers стоят. Смех и грех.
Примечательный факт - Илья Сегалович (один из разработчиков Yandex) не так давно обмолвился на форуме Yandex, что они перестали использовать собственноручно написанную базу для хранения индексов, и пересели на Berkley DB. По нашему, по-бразильски, это интерфейс dbm к handler DB2. Ограничений не забоялись, что харАктерно. Неужели у тебя объемы информации больше, чем у Yandex.
@TSV, ок, все же убедил, что 4 гигов базы мне разумеется хватит
но вопрос не стоит переходить с текстов или нет на DBM
вопрос в другом... (см. начало)
где хранить счетчики просмотров (новостей, статей, фотографий и т.п.), в общем файле (опасность плохого flock), но быстро когда выводишь заголовок и счетчик...
или же в каждый в отдельном файле, flock не страшен, но при выводе заголовков, для каждого надо читать его файл со значением счетчика, чтобы показать это.…
MpaK999, О! Тогда используй счетчик как часть имени файла. - Имя файла <NNN>.<дата>.<время>. <счетчик>.txt - новость
- При увеличении счетчика делаем просто rename()
- В файле первая строка - заголовок, остальное - сама новость
- При выводе списка новостей получаем список из имени файла и его первой строчки
- Никаких lockов и в помине нету. Только нужно вызывать @rename().
MpaK999, - opendir(), сортировать по <NNN>, у меня, кстати, сделано без счетчика, а просто дата и время составляют часть имени файла, по ним и сортирую. Но не суть. Как хошь, так и сортируй.
Long, - chdir($newsdir); glob(<имя файла с '*' вместо счетчика>) MpaK999, а можно и просто
Код:
chdir($newsdir); foreach (glob("*.txt") as $filename) { … }
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.
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.