Класс для работы с файловой БД не нужен!

04.05.2011

Помнится я этим очень загорелся одно время, но к устраивающему меня красивому решению тогда так и не пришёл, потом одно, другое — да и заглохло, как обычно. Ну а теперь снова стало актуально, и вот я пришёл наконец-то к выводу, что универсальное решение вовсе и не нужно. Оно было бы толстомонстрячным и всё равно не учитывало бы требований отдельных проектов.

Ведь огромное значение имеет ещё как и для чего база данных используется. Чаще всего только два варианта: конфиг и список чего-либо (пользователей, продаж, посещений и т. п.). В случае с конфигом данные внутри объекта одномерные — значения конфигурации. А со списками уже многомерные, значит и объекты должны быть устроены различно.

Пока у меня складывается такая схема:

  1. класс чтения/записи (с ЖБ-мьютексами);
  2. от него наследуется класс Config;
  3. … и класс DB тоже.

А как раньше я делал? (и в Daos так)

С помощью отдельной функции загружал данные (в глобальную переменную, естественно), работал с ними, далее надо было не забыть записать их другой функцией, если были изменены. Много заморочек и неудобств. Так же и в раскрутке сайтов много тонких моментов. Поэтому, если нужна раскрутка сайта Москва, лучше доверить её профессионалам. Объекты же можно спроектировать таким образом, что они сами определят, изменились ли данные, и запишут их если нужно. Если я правильно понимаю, это что-то вроде Active Record получится у меня.

В общем, начинаю понимать прелесть не только маленьких методов, но и маленьких классов, решающих одну задачу. Чем меньше и проще всё — тем лучше. Согласны?

Комментарии

  1. # Тормоз

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

  2. # IAD

    Много думал над объектной структурой сайта(классы, конструкторы данных, и.т.д.). Пробовал реализовать. Вывод очень даже интересный: программировать проще не становится. Те же конструкции работают в 2-3 раза медленнее. Решил что оптимальнее событийное программирование. Это когда ключевой элемент системы – событие(операция которую запросил пользователь) и от него начинаем собирать данные и выполнять операции. Такой подход из области функционального программирования, но для php думаю самое оно(в силу скриптового начала). А active record да, удобная штука.

  3. # aktuba: 

    >В общем, начинаю понимать прелесть не только маленьких методов, но и маленьких классов, решающих одну задачу. Чем меньше и проще всё — тем лучше. Согласны?

    С этим полностью согласен. А вот с остальным… Чем тебя базы не устраивают? Да, согласен – конфиги лучше хранить в файлах (редко меняются, часто считываются), но основные данные проще и надежнее в базах.

  4. # Тормоз

    Снова «здоровА»! :)

  5. # aktuba: 

    Ну да, по второму кругу… Но ведь не я один тебе про это говорю ;)

  6. # debian: 

    Тормоз бросай программировать. Хватить порождать говнокод. Ты flock не смог осилить начал мутексы городить… Куда тебе грешнику понять Active Record? Ты даже SQL не можешь понять и орешь, что «он не нужен». Я серьезно, тебе нужно перестать программировать.

  7. # Бутылк.Ус

    Нифига. Дебиан, я ненавижу тебя и тех, откуда ты свистнул ник =) Тебе надо перестать существовать. Даёшь TGZ!

    Тормоз, вообще было бы разумно собрать одним инклюдящимся файлом группу функций, отвечающих за БД. И обращаться к ним. Это действительно разумно. Пишешь что-то вроде mydb_insert($data, time()); и радуешься жизни. Правда, это лучше.

    Я тебе уже говорил, возьми за основу код компонента Limbo для работы с текстовыми базами.

  8. # Rulexec

    А как по мне, Тормоз делает клёвые штуки, которые ещё и покупаются, а уж средство реализации не важно, работает же ведь.

  9. # Тормоз

    debian: Тормоз бросай программировать. Хватить порождать говнокод. Ты flock не смог осилить начал мутексы городить…

    Вообще-то Flock не осилили разработчики PHP, почитай что ли, чего в сети пишут об использовании стандартного flock и чего из этого выходит. Flock ничего не гарантирует. И да, я дошёл до этого опытным путём, когда-то и про flock не знал. Я учусь. А ты?

  10. # Young: 

    Постом навеяло.Тормоз, почитай про Erlang что-ли, так в параллельном режиме.

  11. # debian: 

    Вообще-то Flock не осилили разработчики PHP

    flock не осилил как раз ты

    почитай что ли, чего в сети пишут об использовании стандартного flock и чего из этого выходит

    такие же спецы как ты и пишут

    И да, я дошёл до этого опытным путём

    Покричать что функция работает не так, как тебе хочется, а так как в мане написано, это твой опытный путь? Учеба как раз и подразумевает понимание происходящего, а не отказ от реальности из-за того что она тебе не нравится.

    Можно увидеть пруфы с кодом что флок не работает?

  12. # Тормоз

    Young: Постом навеяло.Тормоз, почитай про Erlang что-ли, так в параллельном режиме.

    Да читал уж. И не раз.

    debian: Можно увидеть пруфы с кодом что флок не работает?

    Можно увидеть пруфы, что лично ты, спец-осилятор реализовал чтение/запись в файл через flock и у тебя ни одного сброса при длительном применении хотя бы на 100-200 тыс. суточных запросов?

  13. # debian: 

    Можно увидеть пруфы, что лично ты, спец-осилятор реализовал чтение/запись в файл через flock

    Может тебе еще нужен пруф что fwrite пишет в файл? Ман – мой пруф.

    Давай устроим челендж:
    1. Говори алгоритм, я понял, что он простой.
    2. Я – пишу код который не сбрасывается.
    3. Тест.
    4. Профит!

    Это будет настоящая учеба. Все в плюсе. По рукам?

  14. # Миша: 

    @debian: зря ты так на посмешище себя выставляешь, флок там реально не работает, не то что в каких-то определенных системах, вообще. но все равно как по мне это не тот путь, только базы только хардкор.

  15. # Миша: 

    но дело там не так в самом флоке как в потоках, процессах, и ошибках в днк пхп…

  16. # debian: 

    зря ты так на посмешище себя выставляешь

    Я готов признать свою неправоту. Заодно откроется истина :)

  17. # Тормоз

    Debian, ясно всё с тобой. Теоретик, на основе своих теорий начинающий срач. Вот лично для тебя пруф, там и тебе может быть всё понятно станет.

  18. # Rulexec

    зря ты так на посмешище себя выставляешь

    Да просто человек троллит, что вы тут.

    Кстати, в превью bq. по-одному показывает, а в результате совсем иначе

  19. # debian: 

    Ну что за слив? Тормоз, я тебе серезно предлагаю.

    Уважаемые комментаторы и посетители, если среди вас есть люди разочаровавшиеся во флоке и которым недостаточно, просто отмахнуться, а есть желание понять – велкам. Давайте устроим реалити шоу. От вас нужен только кусок алгоритма чтения-записи, который сбоит и который я постараюсь сделать безглючным. Я выкладываю код, и все желающие тестят. Таким образом мы сделаем свой вклад, в коллективный программистский разум.

    Неужто никому не интересно?

    Да просто человек троллит, что вы тут.

    Не тролю ни капли. Я реально не понимаю откуда у вас проблемы с флоком.

  20. # aktuba: 

    @debian, нужен кусок кода – поиск по блогу в руки, Тормоз его вроде выкладывал. А вообще – не интересно. Прежде чем кому-то что-то доказывать, ты бы сам провел десяток тестов на разных машинах, под разным софтом (в том числе ос, версии php, наличие/отсутствие акселераторов и пр). Пока что ты сам себя на посмешище выставил, т.к. минимум трое из комментаторов (как я понимаю) тестировали и натыкались на проблемы с flock. Удачи в тестах.

  21. # Spectator

    spectator.ru/?q=floc…

  22. # Spectator

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

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

    Аудитория (комментаторы) тоже смешная.

  23. # Тормоз

    Spectator, я твоё решение читал ещё год назад, когда искал решение проблемы, даже где-то ссылку ставил, вроде. Вероятность сбросов и правда уменьшается, но 100% защиты нет. Для счётчиков некритично может (размер файлов слишком мал), а в моём случае вылезли косяки такого решения.

    Зато теперь всё работает как часы. Даже если сервер внезапно падает, всё восстанавливается.

    P.S. Про недостатки комментов у себя знаю, вряд ли буду исправлять. Мне сейчас важней другие задачи решать в первую очередь, а не движок собственного блога писать :)

  24. # Тормоз

    Кстати, твои статьи про flock написаны 7 лет назад. Может за это время в PHP просто снова поломали что-то, а тогда работало без сбоев.

  25. # debian: 

    FlockRulez

  26. # Spectator

    Наоборот – за семь лет починили, а тогда не работало.

  27. # Тормоз

    В общем, это в прошлом для меня, честно говоря не хочу возвращаться снова в эти флоки. Много времени убил на проблему (ага, и тебя советовали) и всё равно были сбросы. А теперь сбросов нет. Без флоков. И меня это устраивает.

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

  28. # Spectator

    У тебя в блоге весь свет php-программирования просто тусуется, как я погляжу.

    Отсюда и срачи.

  29. # Миша: 

    @debian увидел ретурн в конструкторе дальше не читал, свет, что тут скажешь

  30. # Миша: 

    Нет, все же поглядел, увидел еще и евал…

  31. # Миша: 

    Я не понимаю, как можно такой быдлокод писать еще и оборачивать его в классы? Зачем создавать файл если его нет, не правильнее ли выбросить исключение? Зачем использовать фриды и фопены, если у file_get_contents есть параметры для флагов флока? Зачем постоянно возвращать false если чего не получилось, как оно должно работать, в бесконечном цикле или количеством попыток? А что после, die? Евал вообще вызывает боль в том самом месте, но я понял что ты его туда вписал из-за какого-то кода Тормоза, скорее он его использует. Ладно, но остальное, вышли пацаны из времен пхп3 и пишут классы. Пишите уже функции, только зачем, устрой обычный вызов flock с каким-то тестовым чтением-записью и погоняй его конкурентным ab, все поймешь… Фух, да это батхерт ;).

  32. # debian: 

    Миша: увидел ретурн в конструкторе дальше не читал

    Да. Это мой загон :)

    Миша: все же поглядел, увидел еще и евал

    Эвал нужен Тормозу

    Миша: Зачем создавать файл если его нет, не правильнее ли выбросить исключение?

    Как я понял файл должен создаваться при если его нет. Этот класс приведен как пример, это не точно то что нужно. Просто демонстрация работы флока.

    Миша: Зачем постоянно возвращать false если чего не получилось, как оно должно работать, в бесконечном цикле или количеством попыток?

    См. выше. Я хз как оно должно работать.

    Миша: Зачем использовать фриды и фопены, если у file_get_contents есть параметры для флагов флока?

    Можно вобще через SplFileObject делать, но я сделал так.

    файл_гет_контентс не имет таких флагов. Их имеет пут_контентс :)
    Это тебе не ретурн в конструкторе :)

    Миша: устрой обычный вызов flock с каким-то тестовым чтением-записью и погоняй его конкурентным ab

    У меня штоле у одного все работает?

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

  33. # aktuba: 

    >У меня штоле у одного все работает?

    А ты бы почитал посты Тормоза и понял, что работоспособность очень сильно зависит от окружения. У кого-то работает, у кого-то нет.

  34. # debian: 

    aktuba: А ты бы почитал посты Тормоза

    Я читал его посты. Он – некомпетентен.

    aktuba: работоспособность очень сильно зависит от окружения

    кривизна рук?

    aktuba: У кого-то работает, у кого-то нет

    У тебя работает? Ты имеешь представление о рекоммендательных блокировках? Я вижу ты на чужие коменты ориентируешься только.

  35. # aktuba: 

    >Я читал его посты. Он – некомпетентен.

    О как =))

    >кривизна рук?

    Возможно у некоторых, но не в данном случае.

    >У тебя работает? Ты имеешь представление о рекоммендательных блокировках? Я вижу ты на чужие коменты ориентируешься только.

    Тестил на 4-х серваках. Один и тот же код работал на 3-х, на одном упорно блокировки игнорировались. Видимо я тоже некомпетентен, хотя написал уже не один высоконагруженный проект.

    P.S.: прежде чем кого-то называть некомпетентным, надо быть на 1001% быть уверенным в себе. Судя по твоим комментам – нифига ты даже не тестил в разном окружении. Понтов куча только.

  36. # debian: 

    aktuba: Тестил на 4-х серваках

    Покажи код.

    aktuba: прежде чем кого-то называть некомпетентным, надо быть на 1001% быть уверенным в себе

    Каждый пост Тормоза, связанный с программированием, добавляет мне +25 к уверенности :)

  37. # aktuba: 

    >Покажи код.

    Ты же вроде читал мои комменты? Тогда должен знать, что я не первый раз советую Тормозу использовать базу. Соответственно, код с файлами не храню. Или предлагаешь написать? Тогда будет примерно как у тебя, только на функциях, без класса – тут он лишний, проще в 2 функции уложиться.

    >Каждый пост Тормоза, связанный с программированием, добавляет мне +25 к уверенности :)

    Т.е., ориентируешься на тех, кто сам говорит что плохо программит? Отличный подход! =)

  38. # debian: 

    aktuba: Ты же вроде читал мои комменты? Тогда должен знать, что я не первый раз советую Тормозу использовать базу. Соответственно, код с файлами не храню. Или предлагаешь написать? Тогда будет примерно как у тебя, только на функциях, без класса – тут он лишний, проще в 2 функции уложиться.

    Класс сделан для примера. Я в этой дискуссии никого не убеждаю использовать ООП. То, что у тебя нет кода с файлами – плохо, т.к. у нас получается беспредметный разговор. В этом собственно и проблема – никто не говорит, что вот такой код, он не работает на таком окружении, при таких условиях и т.д. Так ничего не понятно и результата не будет. Торомозу пофиг – он нашел решение и заморачиваться над пониманием ему не охота.

    aktuba: ориентируешься на тех, кто сам говорит что плохо программит

    Я ориентируюсь на тех, кто пришел к решению, разобравшись в ситуации, а не просто бросил «оно не работает/это баг/ну почему нельзя было сделать по-другому». Я уверен в своих знаниях и опыте. Но я всегда открыт для нового понимания, если оно сопровождается весомой аргументацией и примерами, т.е. вещами которые можно не просото принимать на веру, а пощупать/потестить. Все упоминания глюков флока, которые можно нагуглить, в основном, исходят из не понимания работы рекоммендательной блокировки. Самая частая проблема в том что файл открвают с параметром w, что означает обнуление файла. Или в в одном случае блокируем, во втором – нет и удивляемся результату. Надеюсь ты уловил мою мысль.

  39. # aktuba: 

    >Так ничего не понятно и результата не будет.

    Результат есть всегда. Например, Тормоз нашел подходящее для себя решение, а я вообще теперь не связываюсь с файлами =)

    >Я ориентируюсь на тех, кто пришел к решению, разобравшись в ситуации … Надеюсь ты уловил мою мысль.

    А я ориентируюсь на время, потраченое на решение проблемы. Реально, мне все-равно, как решена задача, если она решена быстро и работает ;). Видимо разные подходы.

    По поводу блокировок – снова не в тему пример. Есть сайт, на нем 3 фронтенда. Так вот код работал на 2-х из них (плюс один девелоперский сервак), а на одном не работал. Потратил весь день в попытках разобраться, потом забил и подключил базу. Теперь вопрос: надо ли было тратить день, если можно было за 10 минут переписать код под базу и не заморачиваться?

Комментирование этой статьи закрыто.

Интересное Покупки ТехникаРазное Отдых Статьи Строительство Услуги Общество Хобби Культура Советы Уют