Допустим, текст статьи храниться в БД и содержит некоторый PHP-код. SELECT-ом я текст этот вытаскиваю и сохраняю в переменной.
1. Через echo и print код выводится как есть.
2. Можно написать шаблонизатор, и в текст статьи вставлять шаблоны типа %шаблон%, а перед выводом заменять через str_replace() шаблон на значение. Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
3. Можно конечно еще и в файл писать, а потом через include выводить, но постоянно переписывать файл мне кажется тоже не очень кошерно.
Встал вопрос:
можно ли исполнить PHP из переменной, перед выводом? eval() не подходит, так как придется заморачиваться с синтаксисом специально под эту функцию.
1. Misanthropist - 16 Января, 2014 - 19:10:06 - перейти к сообщению
2. Ch_chov - 16 Января, 2014 - 19:16:50 - перейти к сообщению
Misanthropist пишет:
str_replace работает очень даже быстро.Можно написать шаблонизатор, и в текст статьи вставлять шаблоны типа %шаблон%, а перед выводом заменять через str_replace() шаблон на значение. Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
Misanthropist пишет:
А разве для неё нужен какой то специальный синтаксис?
eval() не подходит, так как придется заморачиваться с синтаксисом специально под эту функцию
3. Мелкий - 16 Января, 2014 - 19:22:52 - перейти к сообщению
Misanthropist пишет:
Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
Eval по понятной причине значительно медленнее. И, вдобавок, значительно медленнее нативного кода, т.к eval делает невозможными многие внутренние оптимизации.
Misanthropist пишет:
постоянно переписывать файл мне кажется тоже не очень кошерно.
А БД чем, по вашему, занимается? Точно так же перезаписывает сектора на дисках.
4. Misanthropist - 16 Января, 2014 - 21:35:44 - перейти к сообщению
Ch_chov
http://ru2.php.net/manual/ru/function.eval.php
Мелкий
Дак я ж в базу писать не собираюсь. Я с нее только читаю.
А запись в файл отнимет время и ресурсы, а также добавит кода. Поэтому и не кошерно.
Цитата:
А разве для неё нужен какой то специальный синтаксис?
http://ru2.php.net/manual/ru/function.eval.php
Цитата:
Код не должен быть обрамлен открывающимся и закрывающимся тегами PHP, т.е. строка должна быть, например, такой 'echo "Привет!";', но не такой '<? echo "Привет!"; >'. Возможно переключатся между режимами PHP и HTML кода, например 'echo "Код PHP!"; ?>Код HTML<? echo "Снова код PHP!";'.
Мелкий
Цитата:
А БД чем, по вашему, занимается? Точно так же перезаписывает сектора на дисках
Дак я ж в базу писать не собираюсь. Я с нее только читаю.
А запись в файл отнимет время и ресурсы, а также добавит кода. Поэтому и не кошерно.
5. Panoptik - 16 Января, 2014 - 22:01:50 - перейти к сообщению
сделайте кеш в базе. исходный код с шаблонами, а потом скомпилируйте его с подставками и просто выводите, а при редактировании исходного кода снова нужно просто перекомпилировать кеш
6. Misanthropist - 16 Января, 2014 - 22:11:12 - перейти к сообщению
Panoptik
Например, при загрузке каждой страницы выводить ip пользователя. Ну, или другие какие-нить данные динамические. Вот как это закешируешь?
Например, при загрузке каждой страницы выводить ip пользователя. Ну, или другие какие-нить данные динамические. Вот как это закешируешь?
7. Panoptik - 16 Января, 2014 - 22:21:27 - перейти к сообщению
тогда str_replace, если так боитесь нагрузки можете клиентом обрабатывать эти данные
8. Мелкий - 16 Января, 2014 - 22:41:11 - перейти к сообщению
Misanthropist пишет:
Дак я ж в базу писать не собираюсь. Я с нее только читаю.
Ну так. Почему тогда в файл надо писать? И с него только чтение будет.
Где вы тут лишний код нашли - тоже не вполне понимаю. Чего-нибудь надо будет подумать, если перерастёте 1 физический веб-сервер, это да. Ну получится пара строк кода на обработку ситуации "файла нет, утянуть из базы".
9. Misanthropist - 16 Января, 2014 - 23:12:29 - перейти к сообщению
Мелкий
Я наоборот все с файлов в базу запихал, а вы говорите: загоняй обратно в файлы.
Т.е. идея была такая:
файл content.php
при каждом обращении к сайту текст выдергивается из базы и записывается в этот файл.
в представлении я инклюдю только этот файл и все, просто его содержимое постоянно меняется.
чем хорошо: мало файлов
что плохо: файл постоянно перезаписывается
где лишние строки?
либо какой-нить echo $var;
либо открыть файл
вставить данные из $var в файл
закрыть файл
Ну, как минимум на 2 строки больше. Да и не уверен, что это будет быстро работать.
(Добавление)
Panoptik
Посылать шаблон и данные для подстановки пользователю?
Я наоборот все с файлов в базу запихал, а вы говорите: загоняй обратно в файлы.
Т.е. идея была такая:
файл content.php
при каждом обращении к сайту текст выдергивается из базы и записывается в этот файл.
в представлении я инклюдю только этот файл и все, просто его содержимое постоянно меняется.
чем хорошо: мало файлов
что плохо: файл постоянно перезаписывается
где лишние строки?
либо какой-нить echo $var;
либо открыть файл
вставить данные из $var в файл
закрыть файл
Ну, как минимум на 2 строки больше. Да и не уверен, что это будет быстро работать.
(Добавление)
Panoptik
Посылать шаблон и данные для подстановки пользователю?
10. Ch_chov - 17 Января, 2014 - 07:17:04 - перейти к сообщению
Misanthropist пишет:
Код не должен быть обрамлен открывающимся и закрывающимся тегами PHP
Ну так эти тэги обычно сразу в eval подставляют:
Вообще смешивать контент и php код не правильно. Потому что это не безопасно. Вы никогда не сможете доверить публикацию такого контенте не проверенным пользователям. Я бы на вашем месте использовал токены, т.е. вставки в специальном формате (например, [user.ip]) и обрабатывал бы их при выводе с помощью callback функций. Можно использовать готовый шаблонизатор. Напрмиер в твиг шаблоне такой текст {{ user.ip }} будет автоматически обработан функцией $user->getIp().