PHP-скрипты в БД и в файлах. Особенности

doran7

Новичок
В некоторых CMS (например в MODX) рабочие PHP-скрипты размещаются в БД MySQL. Насколько такой подход оправдан? Если есть выбор, то где веб-программисту лучше размещать свои PHP-коды - в БД () или в файлах, и почему?

Я новичек в PHP, просмотрел определенное количество информации по этому вопросу, но убедительного обоснования не нашел.
 

Ярослав

Новичок
doran7
Делай в файлах

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

doran7

Новичок
Благодарю, Ярослав. Я собственно так и отлаживаю свои скрипты - в файлах. А потом помещаю их назад в БД, в соответствии со структурой MODX, возможно - зря. Но вот когда они быстрее работают - когда хранятся в файлах или в БД? Разработчики МODX, имхо, для чего-то поместили скрипты в БД, может, из-за быстродействия? Хотелось бы где-нибудь найти подробное описание особенностей работы скриптов для этих двух способов - размещения скриптов в БД и в файлах.
 

Redjik

Джедай-мастер
Они поместили их в бд - потому, что быдлокодеры, и весь modx, что evo, что revo фееричен.

ЗЫ. и да, скрипты не из бд берутся, а из кэша чаще всего.
 

doran7

Новичок
Приветствую, Redjik. Благодарю за интерес к теме.
ЗЫ. и да, скрипты не из бд берутся, а из кэша чаще всего.
Да, это верно. Тем не менее интересует скорость работы скрипта не из кеша, и при первом обращении неизвестного юзера к сайту.

Допустим, работаем без кеша (чтобы от него абстрагироваться). Идет запрос нового, неизвестного юзера. Что быстрее и легче для сервера - достать нужный скрипт (и нужные переменные) из БД или же достать то же самое из файла? Что меньше будет нагружать сервер? У меня нет обоснованного ответа на этот вопрос.

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

Redjik

Джедай-мастер
doran7
я же тебе говорил, пересаживайся на yii или kohana с этого УГ.
посмотришь хоть на нормальный код.

+ полистай ветку Работа, я думаю удивишься...
 

fixxxer

К.О.
Партнер клуба
этот ужасный костыль делают для обхода ограничений на хостингах для динамической установки модулей:
1) апач на шареде обычно работает из-под системного пользователя, то есть на каталоги, в которые сможет писать скрипт, придется проставлять 777
2) если включен safe_mode, то в таком каталоге не получится работать с подкаталогом - то есть валить кучу файлов в одну большую свалку, что при большом числе файлов неприемлемо
никаких иных причин не существует
 

doran7

Новичок
fixxxer, благодарю, пока это самое весомое обоснование. Вот интересно, если скрипт хранится в БД, каков алгоритм его попадания в ОЗУ сервера (на обработку)? Если скрипт из файла можно просто проинклюдить, то что нужно сделать со скриптом из какого-нибудь поля таблицы БД, чтобы он попал на обработку в основной работающий скрипт (т.е. это должен быть некий аналог инклюда, только из БД)?
 

fixxxer

К.О.
Партнер клуба
никакой магии, обычный тупой eval.
да, это ответ на вопрос о производительности ;)

я тут недавно высказывал предположение про stream wrapper, если не лень - проверь. но полюбому это слишком сложные техники для писателей всяких modx и прочего ширпотреба;)
 

Redjik

Джедай-мастер
fixxxer
потому, что APC не умеет eval'ы или все не так просто?
мне для общего развития, я знаю об eval достаточно, чтобы вместо них юзать лямбды, если по-другому никак
 

fixxxer

К.О.
Партнер клуба
а как он может уметь евалы?

вот тебе простой пример eval($_GET['expr'])

как понять, что евалится то же самое, что в прошлый раз? считать md5? ок, а как потом загаженный этим кэш инвалидировать? по таймауту? и городить это все для любителей евала?
 

doran7

Новичок
Нашел вот интересную статейку "Хранение php-кода в базе MySQL":
http://webew.ru/posts/2427.webew

Алгоритм исполнения скрипта, хранимого в БД, получается такой:
1) соединение с БД, запрос на считывание скрипта в строковую переменную, например $script;
2) исполнение скрипта через eval(): eval($script); .

При этом без eval не знаю как обойтись, хотя сильно эту eval ругают.

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

Благодарю всех откликнувшихся за интерес к теме.
 

doran7

Новичок
---------------------------------------------------
Эта часть топика исправлена и уточнена, вследствие критики Вурдалака. Теперь, вроде, без косяков

Интересная статья How to use eval() without using eval() in PHP
http://gonzalo123.com/2012/03/12/how-to-use-eval-without-using-eval-in-php/

Один из вариантов как избавиться от применения eval описан автором статьи так: My idea is simple. Create a temporary file with the PHP source code, include this file with the standard PHP’s include functions and destroy the temporary file.. Автор пишет, что на производительности это ощутимо не сказывается.

Имхо, такой вариант применим и в том случае, когда скрипт PHP хранится в БД. Насколько это оптимально - не могу судить.
-----------------------------------------------

Есть неофициальные сбррки CMS MODX Evo, в которых все модули, сниппеты, плагины из БД перенесены в файлы, все работает, и даже лучше. При этом может и есть какие-то подводные камни, но они мне неизвестны. Хотелось бы знать, что может проявиться. Для MODX это когда-нибудь выяснится, возможно. В MODX Evo эти eval сидят в скриптых (в ядре тоже) и как от них избавиться и к чему это приведет - вопрос в тумане.
Что же касательно отдельных независимых проектов на PHP- для себя решил на данном этапе в БД скрипты не помещать и eval стараться не использовать.
 

Вурдалак

Продвинутый новичок
Интересная статья How to use eval() without using eval() in PHP
http://gonzalo123.com/2012/03/12/how-to-use-eval-without-using-eval-in-php/

Один из вариантов как избавиться от применения eval когда скрипт хранится в БД; My idea is simple. Create a temporary file with the PHP source code, include this file with the standard PHP’s include functions and destroy the temporary file.. Автор пишет, что на производительности это ощутимо не сказывается.
facepalm.jpg
 

doran7

Новичок
Вурдалак, где-то я накосячил в цитате? Пока особо не врубаюсь... Исправил, вроде убрал неточности.
 
Сверху