Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Исполнение PHP-сода из переменной
Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
Допустим, текст статьи храниться в БД и содержит некоторый PHP-код. SELECT-ом я текст этот вытаскиваю и сохраняю в переменной.
1. Через echo и print код выводится как есть.
2. Можно написать шаблонизатор, и в текст статьи вставлять шаблоны типа %шаблон%, а перед выводом заменять через str_replace() шаблон на значение. Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
3. Можно конечно еще и в файл писать, а потом через include выводить, но постоянно переписывать файл мне кажется тоже не очень кошерно.
Встал вопрос:
можно ли исполнить PHP из переменной, перед выводом? eval() не подходит, так как придется заморачиваться с синтаксисом специально под эту функцию.
Ch_chov
Отправлено: 16 Января, 2014 - 19:16:50
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
Misanthropist пишет:
Можно написать шаблонизатор, и в текст статьи вставлять шаблоны типа %шаблон%, а перед выводом заменять через str_replace() шаблон на значение. Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
str_replace работает очень даже быстро.
Misanthropist пишет:
eval() не подходит, так как придется заморачиваться с синтаксисом специально под эту функцию
А разве для неё нужен какой то специальный синтаксис?
Мелкий
Отправлено: 16 Января, 2014 - 19:22:52
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Misanthropist пишет:
Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
Eval по понятной причине значительно медленнее. И, вдобавок, значительно медленнее нативного кода, т.к eval делает невозможными многие внутренние оптимизации.
Misanthropist пишет:
постоянно переписывать файл мне кажется тоже не очень кошерно.
А БД чем, по вашему, занимается? Точно так же перезаписывает сектора на дисках.
----- PostgreSQL DBA
Misanthropist
Отправлено: 16 Января, 2014 - 21:35:44
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
Ch_chov
Цитата:
А разве для неё нужен какой то специальный синтаксис?
Код не должен быть обрамлен открывающимся и закрывающимся тегами PHP, т.е. строка должна быть, например, такой 'echo "Привет!";', но не такой '<? echo "Привет!"; >'. Возможно переключатся между режимами PHP и HTML кода, например 'echo "Код PHP!"; ?>Код HTML<? echo "Снова код PHP!";'.
Мелкий
Цитата:
А БД чем, по вашему, занимается? Точно так же перезаписывает сектора на дисках
Дак я ж в базу писать не собираюсь. Я с нее только читаю.
А запись в файл отнимет время и ресурсы, а также добавит кода. Поэтому и не кошерно.
Panoptik
Отправлено: 16 Января, 2014 - 22:01:50
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
сделайте кеш в базе. исходный код с шаблонами, а потом скомпилируйте его с подставками и просто выводите, а при редактировании исходного кода снова нужно просто перекомпилировать кеш
----- Just do it
Misanthropist
Отправлено: 16 Января, 2014 - 22:11:12
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
Panoptik
Например, при загрузке каждой страницы выводить ip пользователя. Ну, или другие какие-нить данные динамические. Вот как это закешируешь?
Panoptik
Отправлено: 16 Января, 2014 - 22:21:27
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
тогда str_replace, если так боитесь нагрузки можете клиентом обрабатывать эти данные
----- Just do it
Мелкий
Отправлено: 16 Января, 2014 - 22:41:11
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Misanthropist пишет:
Дак я ж в базу писать не собираюсь. Я с нее только читаю.
Ну так. Почему тогда в файл надо писать? И с него только чтение будет.
Где вы тут лишний код нашли - тоже не вполне понимаю. Чего-нибудь надо будет подумать, если перерастёте 1 физический веб-сервер, это да. Ну получится пара строк кода на обработку ситуации "файла нет, утянуть из базы".
----- PostgreSQL DBA
Misanthropist
Отправлено: 16 Января, 2014 - 23:12:29
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
Мелкий
Я наоборот все с файлов в базу запихал, а вы говорите: загоняй обратно в файлы.
Т.е. идея была такая:
файл content.php
при каждом обращении к сайту текст выдергивается из базы и записывается в этот файл.
в представлении я инклюдю только этот файл и все, просто его содержимое постоянно меняется.
чем хорошо: мало файлов
что плохо: файл постоянно перезаписывается
где лишние строки?
либо какой-нить echo $var;
либо открыть файл
вставить данные из $var в файл
закрыть файл
Ну, как минимум на 2 строки больше. Да и не уверен, что это будет быстро работать. (Добавление) Panoptik
Посылать шаблон и данные для подстановки пользователю?
Ch_chov
Отправлено: 17 Января, 2014 - 07:17:04
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
Misanthropist пишет:
Код не должен быть обрамлен открывающимся и закрывающимся тегами PHP
Вообще смешивать контент и php код не правильно. Потому что это не безопасно. Вы никогда не сможете доверить публикацию такого контенте не проверенным пользователям. Я бы на вашем месте использовал токены, т.е. вставки в специальном формате (например, [user.ip]) и обрабатывал бы их при выводе с помощью callback функций. Можно использовать готовый шаблонизатор. Напрмиер в твиг шаблоне такой текст {{ user.ip }} будет автоматически обработан функцией $user->getIp().
Misanthropist
Отправлено: 17 Января, 2014 - 11:33:33
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
Ch_chov
Так вот поэтому и говорю - eval не вариант.
А подскажи по поводу обработки при выводе с помощью callback функций: как организовать вызов callback-функции при выводе?
esterio
Отправлено: 17 Января, 2014 - 11:46:20
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
eval наверно самое худшее что можна использовать учитивая то, что данные идут с базы.
если вам нужно пользователу предоставить способ подстановки переменных в тексте, то используйте str_replace или preg_replace. А в качестве аргументов передавайте массивы. Чтобы все не тормозило используйте кеширование. маркеры не должны быть ПХП кодом, а иметь специфическый формат (например %var%)
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
esterio, так ведь это обычный шаблонизатор. К нему данные нужно приготовить заранее. Если на сайте используются сотни токенов то их придется все обработать и передать в шаблон. Не смотря на то, что исходный текст может содержать все 2-3 токена.
esterio
Отправлено: 17 Января, 2014 - 12:39:30
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
лучше уж так чем eval
Ch_chov
Отправлено: 17 Января, 2014 - 13:28:40
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
Лучше вместо для обработки токенов использовать callback фукнции. Т.е. подгружать данные только если они действительно будут выводится.
Другой вариант (пример из друпала): https://api.drupal.org/api/drupal/includes!token.inc/function/token_replace/7
Вытащить из текста регуляркой список токенов
Получить значения этих токенов
Заменить токены на их значения с помощью str_replace
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.