LINUX.ORG.RU

[php][текстовая бд] одобрите?

 


0

2

делаю сайт, - публикация статей с комментариями и форум. все свое. пришел к окончательному виду текстовой бд, но поскольку в этом не разбираюсь, прошу либо одобрить ее формат и идею, либо я перейду на sql. :(

база хранится в текстовых файлах .php с содержимым «<?php die; ?>serialize данные», т.е. получается что перезаписывается весь файл при малейшем внесении изменений. все хранится массивами.

две функции для работы с базой:

function array_get_contents($file) {
  return unserialize(substr(file_get_contents($file), 13));
}
function array_put_contents($file, $data) {
  return file_put_contents($file, '<?php die; ?>'.serialize($data), LOCK_EX);
}

теперь к сайту. статья и два комментария к ней выглядят как /files/journal/0.php (где 0 это ID записи):

array(
  array(
    'is_article',
    'title' => 'название статьи',
    'contents' => 'содержание статьи'
  ),
  array(
    'is_note',
    'file' => 0,
    'note' => 0
  ),
  array(
    'is_note',
    'file' => 0,
    'note' => 1
  )
)
то есть, имеем массив внутри которого хранятся массивы, и внутри этих массивов есть определяющая переменная, «что это такое» - статья, или комментарий, или еще что-то. можно расширить функционал и добавлять новые элементы в базу в любой момент.

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

теперь база с комментариями, которая хранится отдельно. сейчас есть всего два комментария и они умещаются в одном файле /files/notes/0.php, а когда размер базы с комментариями достигнет например 2мб, то будет создана другая база 1.php, 2.php и все новые комментарии будут добавляться в нее, а также создаваться «ссылки» в статьях уже на file => 1, file => 2, и т.д.

array(
  array(
    'contents' => 'первый комментарий, в массике как array[0]'
  ),
  array(
    'contents' => 'второй комментарий, в массиве как array[1]'
  )
)

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

например, один комментарий весит 4096 байт, и чтобы комментарии достигли уже нашего лимита 2мб на один файл, это нужно (2 * 1024 * 1024) / 4096 = 512 комментариев. в ext3/4 лимит на количество файлов в одной директории 32768 (не помню где и как точно, возьмем грубо 32к). (2мб один файл * лимит 32768 файлов) = 65гб комментариев, может быть на сайте, а всего это 16,777,216 (читайте: 16 миллионов комментариев) - хватит на десяток лет для любого популярного ресурса типа лора, не так ли?

и тоже самое будет относиться к форуму на сайте. создается тред (файл с данными о теме), а в нем хранятся лишь «ссылки» на сообщения, которые также хранятся отдельно, в другом месте.

плюсы такого велосипеда, что все логично, в отдельных массивах, статьи, комментарии - в разных местах. расширяемо, т.е. добавляем массив с какой-нибудь 'is_vote', и считаем что это уже опрос. в отличии от flat-file, где структура будет не такая красивая. :) и еще раз, что при описанном подходе размер базы может быть очень велик, хватит ее на долгое время, а учитывая непопулярность ресурса - на всю жизнь.

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

${SUBJ}

★★★★★
Ответ на: комментарий от moscwich

Для каких огромных проектов уместна MySQL? Любой маломальски сложный и нагруженный проект юзающий MySQL, или любую другую реляционку, ляжет не поднявшись. Мускулы годны только для маленьких и средних проектов, и то редко.

Для микропроектов, лучше уж запилить велосипед типа ТСовского. Ну глупо держать целый сервер БД для гостевухи на сотню записей.

Для крупных проектов SQL тоже слишком тормозной.

По факту MySQL нишевое решение получившее распространение только благодаря тому, что при его использовании не надо думать. В итоге пхпкодеры пихают туда уже и блобы и html код страничек своих CMS и мы имеем то, что имеем...

Так чта в чем-то ТС прав.

Suntechnic ★★★★★
()
Ответ на: комментарий от Spoofing

Ты чего хотел-то, от такого хранения как ты заюзал получить? Производительности или простоты использования?

Suntechnic ★★★★★
()
Ответ на: комментарий от mopsene

Ну только если sqlite. А вообще в этом случае и ФС ничем не хуже.

Suntechnic ★★★★★
()
Ответ на: комментарий от mopsene

И если уж sqlite, то Tcl. PHP не нужен.

На самом же деле есть смысл посмотреть в сторону NoSQL. Mongo говорят неплох. Я же заюзал Redis'ку. Тоже доставляет. Правда пришлось переписать пакет для биндинга, ибо не понимал ничего кроме ASCII...

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

Как меня убедили, производительности при такой базе не добьешься, но хотел именно ее. Сейчас за 5 минут гугла выбор пал на PostgreSQL из-за более строгого следования стандартам, чем у MySQL. Но ведь MySQL популярнее... Снова возникают дилеммы :( с файлами такого нет, - делаешь и все...

Я не так хорошо знаю php (скорее вовсе не знаю), чтобы быть его фанатом, и поэтому при смене БД мне кажется, что проще сменить язык, чтобы написать производительный сайт. Нет, сайт элемантарно «домашний бложик про себя», но из-за интереса к хайлоадам хочу такой, хайлоад-ориентированный сайт. :)

Было б замечательно, если бы мне сказали в сторону чего смотреть. PostgreSQL, Memcached, и... какой язык программирования выбрать?

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

Так, хватит метаться, давай делай.

1. Бери mysql - пригодится, освоишь основные принципы и т.д. Для веба самое то.

2. Бери php или python.

mopsene ★★★
()
Ответ на: комментарий от Spoofing

PHP и MySQL - наиболее популярные. Но никакого хайлода не выйдет... У PHP есть еще огромный плюс - его не надо знать, что бы писать на нем. Я вот не знаю, но успешно поддерживаю несколько сайтов и даже исправляю периодически ляпы их создателей.
Вобщем это доводы разума в выборе, ибо логично выбирать мэйнстрим.

Если хочешь хайлоад, то тут NoSQL в качестве базы, во-первых. Во-вторых нафиг апач. Нужно юзать что-то полегче и побыстрее. Самый хардкор - fnord или gatling + cgi отдающий страницу по мере готовности.

Suntechnic ★★★★★
()
Ответ на: комментарий от Spoofing

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

hobbit ★★★★★
()
Ответ на: комментарий от drBatty

Один большой сервер решает множество проблем.

Например? Сервер - это мутота, мое мнение, и может быть уместен только иногда для огромных проектов (домашняя страница до сервиса аля tutu.ru никогда не разрастется).
Вот нет у меня никаких проблем с SQLite. Кстати легкой она не просто так называется, она действительно легкая. И быстрая, пока в база не на 100500*9000 строк. А еще SQLite вроде как в PHP по-дефолту.

даты

Количество секунд с начала эпохи Unix. Хотя, если речь о дате без времени, то да, надо как-то иначе...

moscwich
()
Ответ на: комментарий от Suntechnic

Во-вторых нафиг апач.

Это во-первых. После замены apache на nginx/httpd + fast-cgi вопрос хайлоада откладывается очень надолго, иногда на годы :)



Я пока ещё ни в одном своём проекте в нехватку производительности БД, которая решается только заменой MySQL на NoSQL, ещё не столкнулся.

KRoN73 ★★★★★
()
Ответ на: комментарий от moscwich

Кстати легкой она не просто так называется, она действительно легкая. И быстрая, пока в база не на 100500*9000 строк

Или пока десяток юзеров параллельно работать не начнут. sqlite — это полная огромная жирная жопа на параллельной работе.

А еще SQLite вроде как в PHP по-дефолту.

Не на всех хостингах вкомпилён/установлен.

KRoN73 ★★★★★
()
Ответ на: комментарий от Suntechnic

По факту MySQL нишевое решение получившее распространение только благодаря тому, что при его использовании не надо думать.

При использовании SQLite думать надо еще меньше, а можно и еще меньше (например можно не задавать тип данных для полей).
Если честно, я с MySQL работал очень мало. Очевидно, что SQLite в 100500 раз лучше мускула для не больших проектов. Для огромных - хз, что ты предлагаешь?

moscwich
()

В качестве сервера использую nginx, и заговорив про веб-серверы вы навели меня на мысль... А ведь он умеет искоробки листинг директорий, угу? И можно устанавливать свои собственные header/footer страниц, и, наверно, вообще изменять дизайн любого элемента. А что если сделать сайт статичным, используя исключительно серверные фичи? И пускай он занимается отрисовкой страниц, статья будет лежать в обычном txt файле, и например при открытии txt файла сервер еще подставляет header/footer сайта. :)

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

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

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

nginx не умеет cgi. Fast-CGI не всегда удобен, а иногда чересчур сложен. При этом весь прирост производительности FCGI над CGI базируется на том, что для CGI используются, как правило *sh оболочки которые инициируются или долго или очень долго. А если *sh заменить на враперы юзающие соответствующие интерпретаторы в том виде в котором они действительно нужны, этот прирост столь большим уже не выглядит.

Suntechnic ★★★★★
()
Ответ на: комментарий от Spoofing

Получишь очень негибкое решени.

Вообще если хочешь Ъ хардкор, напиши для своего сайта сменный API который будет юзать ту базу, которую ты ему скажешь.

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

nginx не умеет cgi

И фиг бы с ним. Мы тут о производительности, вроде, говорим.

этот прирост столь большим уже не выглядит.

Ты ab прогони на одно решение на apache и на nginx. И удивись.

По сравнению с этим все разговоры про NoSQL — просто не в тему.

KRoN73 ★★★★★
()
Ответ на: комментарий от moscwich

Очевидно, что SQLite в 100500 раз лучше мускула для не больших проектов.

Ну только если на сайте не больше одного посетителя, то да, возможно местами лучше.

tensai_cirno ★★★★★
()
Ответ на: комментарий от Suntechnic

Fast-CGI не всегда удобен, а иногда чересчур сложен. При этом весь прирост производительности FCGI над CGI базируется на том, что для CGI используются, как правило *sh оболочки которые инициируются или долго или очень долго. А если *sh заменить на враперы юзающие соответствующие интерпретаторы в том виде в котором они действительно нужны, этот прирост столь большим уже не выглядит.

Выдыхай, пожайлуста.

tensai_cirno ★★★★★
()

Не думал, что можно лору доставить столько попоболи за один тред. ТС нереально толст.

sphericalhorse ★★★★★
()
Ответ на: комментарий от tensai_cirno

В каком месте выдохнуть?

А может лучше посоревноваться - ваш fcgi vs мой cgi, решающие одну простенькую задачу? Тут-то истина и всплывет. Посмотрим правда ли fcgi в разы быстрее. Глядишь выяснится что я не прав и я чему-то еще научусь...

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

Разве ж это жестко? Копейки, тем более для синтетики :)

Это на ноуте, Intel(R) Core(TM)2 Duo CPU L7500 @ 1.60GHz.

Можно и гораздо больше выдавить, если вдавить не на медленном руби и подкрутить лимиты по сокетам. CGI каждый раз перегружает рантайм, это Д_О_Х_Р_Е_Н_А времени и ресурсов. В то время когда по fcgi мы просто получаем реквест и отвечаем.

Про реляционки и хайлоад тоже глупости написал же. Масштабировать можно что угодно, главное правильно делать. Ну и архитектуру нормально строить. У скайпа, к примеру, всё на постгре крутится.

tensai_cirno ★★★★★
()
Ответ на: комментарий от tensai_cirno

Перегружать рантайм можно тоже быстро. И я не говорил, что cgi обгонит fcgi но отставание не смертельное, особенно учитывая, что у тебя совсем не апач...

$ siege -r 5 -d 3 -c 1000 http://192.168.8.1/iiindex.cgi
...
блаблабла
...
Transactions:		        5000 hits
Availability:		       100.00 %
Elapsed time:		       55.06 secs
Data transferred:	        0.03 MB
Response time:		        7.24 secs
Transaction rate:	       90.81 trans/sec
Throughput:		        0.00 MB/sec
Concurrency:		      657.21
Successful transactions:        4820
Failed transactions:	         0
Longest transaction:	       17.06
Shortest transaction:	        5.01

AMD Athlon(tm) 64 X2 Dual Core Processor 5600+

Suntechnic ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.