Класс для работы с файловой БД не нужен!
04.05.2011 технологии
Помнится я этим очень загорелся одно время, но к устраивающему меня красивому решению тогда так и не пришёл, потом одно, другое — да и заглохло, как обычно. Ну а теперь снова стало актуально, и вот я пришёл наконец-то к выводу, что универсальное решение вовсе и не нужно. Оно было бы толстомонстрячным и всё равно не учитывало бы требований отдельных проектов.
Ведь огромное значение имеет ещё как и для чего база данных используется. Чаще всего только два варианта: конфиг и список чего-либо (пользователей, продаж, посещений и т. п.). В случае с конфигом данные внутри объекта одномерные — значения конфигурации. А со списками уже многомерные, значит и объекты должны быть устроены различно.
Пока у меня складывается такая схема:
- класс чтения/записи (с ЖБ-мьютексами);
- от него наследуется класс Config;
- … и класс DB тоже.
А как раньше я делал? (и в Daos так)
С помощью отдельной функции загружал данные (в глобальную переменную, естественно), работал с ними, далее надо было не забыть записать их другой функцией, если были изменены. Много заморочек и неудобств. Так же и в раскрутке сайтов много тонких моментов. Поэтому, если нужна раскрутка сайта Москва, лучше доверить её профессионалам. Объекты же можно спроектировать таким образом, что они сами определят, изменились ли данные, и запишут их если нужно. Если я правильно понимаю, это что-то вроде Active Record получится у меня.
В общем, начинаю понимать прелесть не только маленьких методов, но и маленьких классов, решающих одну задачу. Чем меньше и проще всё — тем лучше. Согласны?
Комментарии
Комментирование этой статьи закрыто.
Ха, а для актуального сейчас проекта даже мьютексы не нужны. Спроектировал хранение данных так, что одновременных запросов просто не может быть.
Много думал над объектной структурой сайта(классы, конструкторы данных, и.т.д.). Пробовал реализовать. Вывод очень даже интересный: программировать проще не становится. Те же конструкции работают в 2-3 раза медленнее. Решил что оптимальнее событийное программирование. Это когда ключевой элемент системы – событие(операция которую запросил пользователь) и от него начинаем собирать данные и выполнять операции. Такой подход из области функционального программирования, но для php думаю самое оно(в силу скриптового начала). А active record да, удобная штука.
>В общем, начинаю понимать прелесть не только маленьких методов, но и маленьких классов, решающих одну задачу. Чем меньше и проще всё — тем лучше. Согласны?
С этим полностью согласен. А вот с остальным… Чем тебя базы не устраивают? Да, согласен – конфиги лучше хранить в файлах (редко меняются, часто считываются), но основные данные проще и надежнее в базах.
Снова «здоровА»! :)
Ну да, по второму кругу… Но ведь не я один тебе про это говорю ;)
Тормоз бросай программировать. Хватить порождать говнокод. Ты flock не смог осилить начал мутексы городить… Куда тебе грешнику понять Active Record? Ты даже SQL не можешь понять и орешь, что «он не нужен». Я серьезно, тебе нужно перестать программировать.
Нифига. Дебиан, я ненавижу тебя и тех, откуда ты свистнул ник =) Тебе надо перестать существовать. Даёшь TGZ!
Тормоз, вообще было бы разумно собрать одним инклюдящимся файлом группу функций, отвечающих за БД. И обращаться к ним. Это действительно разумно. Пишешь что-то вроде mydb_insert($data, time()); и радуешься жизни. Правда, это лучше.
Я тебе уже говорил, возьми за основу код компонента Limbo для работы с текстовыми базами.
А как по мне, Тормоз делает клёвые штуки, которые ещё и покупаются, а уж средство реализации не важно, работает же ведь.
Вообще-то Flock не осилили разработчики PHP, почитай что ли, чего в сети пишут об использовании стандартного flock и чего из этого выходит. Flock ничего не гарантирует. И да, я дошёл до этого опытным путём, когда-то и про flock не знал. Я учусь. А ты?
Постом навеяло.Тормоз, почитай про Erlang что-ли, так в параллельном режиме.
flock не осилил как раз ты
такие же спецы как ты и пишут
Покричать что функция работает не так, как тебе хочется, а так как в мане написано, это твой опытный путь? Учеба как раз и подразумевает понимание происходящего, а не отказ от реальности из-за того что она тебе не нравится.
Можно увидеть пруфы с кодом что флок не работает?
Да читал уж. И не раз.
Можно увидеть пруфы, что лично ты, спец-осилятор реализовал чтение/запись в файл через flock и у тебя ни одного сброса при длительном применении хотя бы на 100-200 тыс. суточных запросов?
Может тебе еще нужен пруф что fwrite пишет в файл? Ман – мой пруф.
Давай устроим челендж:
1. Говори алгоритм, я понял, что он простой.
2. Я – пишу код который не сбрасывается.
3. Тест.
4. Профит!
Это будет настоящая учеба. Все в плюсе. По рукам?
@debian: зря ты так на посмешище себя выставляешь, флок там реально не работает, не то что в каких-то определенных системах, вообще. но все равно как по мне это не тот путь, только базы только хардкор.
но дело там не так в самом флоке как в потоках, процессах, и ошибках в днк пхп…
Я готов признать свою неправоту. Заодно откроется истина :)
Debian, ясно всё с тобой. Теоретик, на основе своих теорий начинающий срач. Вот лично для тебя пруф, там и тебе может быть всё понятно станет.
Да просто человек троллит, что вы тут.
Кстати, в превью bq. по-одному показывает, а в результате совсем иначе
Ну что за слив? Тормоз, я тебе серезно предлагаю.
Уважаемые комментаторы и посетители, если среди вас есть люди разочаровавшиеся во флоке и которым недостаточно, просто отмахнуться, а есть желание понять – велкам. Давайте устроим реалити шоу. От вас нужен только кусок алгоритма чтения-записи, который сбоит и который я постараюсь сделать безглючным. Я выкладываю код, и все желающие тестят. Таким образом мы сделаем свой вклад, в коллективный программистский разум.
Неужто никому не интересно?
Не тролю ни капли. Я реально не понимаю откуда у вас проблемы с флоком.
@debian, нужен кусок кода – поиск по блогу в руки, Тормоз его вроде выкладывал. А вообще – не интересно. Прежде чем кому-то что-то доказывать, ты бы сам провел десяток тестов на разных машинах, под разным софтом (в том числе ос, версии php, наличие/отсутствие акселераторов и пр). Пока что ты сам себя на посмешище выставил, т.к. минимум трое из комментаторов (как я понимаю) тестировали и натыкались на проблемы с flock. Удачи в тестах.
spectator.ru/?q=floc…
Как тут всё смешно. После комментария тяжело оставить следующий, а последняя буква заменилась на троеточие (которое длиннее, чем одна буква).
Кнопку «сохранить» надо убрать, потому что не понятно, почему она задизабленная, а «предпросмотр» переименовать в что-нибудь адекватное, типа «предпросмотр и сохранение».
Аудитория (комментаторы) тоже смешная.
Spectator, я твоё решение читал ещё год назад, когда искал решение проблемы, даже где-то ссылку ставил, вроде. Вероятность сбросов и правда уменьшается, но 100% защиты нет. Для счётчиков некритично может (размер файлов слишком мал), а в моём случае вылезли косяки такого решения.
Зато теперь всё работает как часы. Даже если сервер внезапно падает, всё восстанавливается.
P.S. Про недостатки комментов у себя знаю, вряд ли буду исправлять. Мне сейчас важней другие задачи решать в первую очередь, а не движок собственного блога писать :)
Кстати, твои статьи про flock написаны 7 лет назад. Может за это время в PHP просто снова поломали что-то, а тогда работало без сбоев.
FlockRulez
Наоборот – за семь лет починили, а тогда не работало.
В общем, это в прошлом для меня, честно говоря не хочу возвращаться снова в эти флоки. Много времени убил на проблему (ага, и тебя советовали) и всё равно были сбросы. А теперь сбросов нет. Без флоков. И меня это устраивает.
Странно только, что у меня в блоге уже который раз повторяются срачи на эту тему, хотя сейчас вот в заметке ничего не было про блокировки. Нет же, устроили холивар.
У тебя в блоге весь свет php-программирования просто тусуется, как я погляжу.
Отсюда и срачи.
@debian увидел ретурн в конструкторе дальше не читал, свет, что тут скажешь
Нет, все же поглядел, увидел еще и евал…
Я не понимаю, как можно такой быдлокод писать еще и оборачивать его в классы? Зачем создавать файл если его нет, не правильнее ли выбросить исключение? Зачем использовать фриды и фопены, если у file_get_contents есть параметры для флагов флока? Зачем постоянно возвращать false если чего не получилось, как оно должно работать, в бесконечном цикле или количеством попыток? А что после, die? Евал вообще вызывает боль в том самом месте, но я понял что ты его туда вписал из-за какого-то кода Тормоза, скорее он его использует. Ладно, но остальное, вышли пацаны из времен пхп3 и пишут классы. Пишите уже функции, только зачем, устрой обычный вызов flock с каким-то тестовым чтением-записью и погоняй его конкурентным ab, все поймешь… Фух, да это батхерт ;).
Да. Это мой загон :)
Эвал нужен Тормозу
Как я понял файл должен создаваться при если его нет. Этот класс приведен как пример, это не точно то что нужно. Просто демонстрация работы флока.
См. выше. Я хз как оно должно работать.
Можно вобще через SplFileObject делать, но я сделал так.
файл_гет_контентс не имет таких флагов. Их имеет пут_контентс :)
Это тебе не ретурн в конструкторе :)
У меня штоле у одного все работает?
И еще я считаю, что хранить даные, которые постоянно изменяются, в пхп-файле – это не есть гут и как минимум не удобно. В пхп-файле удобно хранить статическую инфу, типа конфига.
>У меня штоле у одного все работает?
А ты бы почитал посты Тормоза и понял, что работоспособность очень сильно зависит от окружения. У кого-то работает, у кого-то нет.
Я читал его посты. Он – некомпетентен.
кривизна рук?
У тебя работает? Ты имеешь представление о рекоммендательных блокировках? Я вижу ты на чужие коменты ориентируешься только.
>Я читал его посты. Он – некомпетентен.
О как =))
>кривизна рук?
Возможно у некоторых, но не в данном случае.
>У тебя работает? Ты имеешь представление о рекоммендательных блокировках? Я вижу ты на чужие коменты ориентируешься только.
Тестил на 4-х серваках. Один и тот же код работал на 3-х, на одном упорно блокировки игнорировались. Видимо я тоже некомпетентен, хотя написал уже не один высоконагруженный проект.
P.S.: прежде чем кого-то называть некомпетентным, надо быть на 1001% быть уверенным в себе. Судя по твоим комментам – нифига ты даже не тестил в разном окружении. Понтов куча только.
Покажи код.
Каждый пост Тормоза, связанный с программированием, добавляет мне +25 к уверенности :)
>Покажи код.
Ты же вроде читал мои комменты? Тогда должен знать, что я не первый раз советую Тормозу использовать базу. Соответственно, код с файлами не храню. Или предлагаешь написать? Тогда будет примерно как у тебя, только на функциях, без класса – тут он лишний, проще в 2 функции уложиться.
>Каждый пост Тормоза, связанный с программированием, добавляет мне +25 к уверенности :)
Т.е., ориентируешься на тех, кто сам говорит что плохо программит? Отличный подход! =)
Класс сделан для примера. Я в этой дискуссии никого не убеждаю использовать ООП. То, что у тебя нет кода с файлами – плохо, т.к. у нас получается беспредметный разговор. В этом собственно и проблема – никто не говорит, что вот такой код, он не работает на таком окружении, при таких условиях и т.д. Так ничего не понятно и результата не будет. Торомозу пофиг – он нашел решение и заморачиваться над пониманием ему не охота.
Я ориентируюсь на тех, кто пришел к решению, разобравшись в ситуации, а не просто бросил «оно не работает/это баг/ну почему нельзя было сделать по-другому». Я уверен в своих знаниях и опыте. Но я всегда открыт для нового понимания, если оно сопровождается весомой аргументацией и примерами, т.е. вещами которые можно не просото принимать на веру, а пощупать/потестить. Все упоминания глюков флока, которые можно нагуглить, в основном, исходят из не понимания работы рекоммендательной блокировки. Самая частая проблема в том что файл открвают с параметром w, что означает обнуление файла. Или в в одном случае блокируем, во втором – нет и удивляемся результату. Надеюсь ты уловил мою мысль.
>Так ничего не понятно и результата не будет.
Результат есть всегда. Например, Тормоз нашел подходящее для себя решение, а я вообще теперь не связываюсь с файлами =)
>Я ориентируюсь на тех, кто пришел к решению, разобравшись в ситуации … Надеюсь ты уловил мою мысль.
А я ориентируюсь на время, потраченое на решение проблемы. Реально, мне все-равно, как решена задача, если она решена быстро и работает ;). Видимо разные подходы.
По поводу блокировок – снова не в тему пример. Есть сайт, на нем 3 фронтенда. Так вот код работал на 2-х из них (плюс один девелоперский сервак), а на одном не работал. Потратил весь день в попытках разобраться, потом забил и подключил базу. Теперь вопрос: надо ли было тратить день, если можно было за 10 минут переписать код под базу и не заморачиваться?