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-сода из переменной

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Misanthropist
Отправлено: 16 Января, 2014 - 19:10:06
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Допустим, текст статьи храниться в БД и содержит некоторый PHP-код. SELECT-ом я текст этот вытаскиваю и сохраняю в переменной.

1. Через echo и print код выводится как есть.
2. Можно написать шаблонизатор, и в текст статьи вставлять шаблоны типа %шаблон%, а перед выводом заменять через str_replace() шаблон на значение. Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
3. Можно конечно еще и в файл писать, а потом через include выводить, но постоянно переписывать файл мне кажется тоже не очень кошерно.

Встал вопрос:
можно ли исполнить PHP из переменной, перед выводом? eval() не подходит, так как придется заморачиваться с синтаксисом специально под эту функцию.
 
 Top
Ch_chov
Отправлено: 16 Января, 2014 - 19:16:50
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Misanthropist пишет:
Можно написать шаблонизатор, и в текст статьи вставлять шаблоны типа %шаблон%, а перед выводом заменять через str_replace() шаблон на значение. Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.
str_replace работает очень даже быстро.

Misanthropist пишет:
eval() не подходит, так как придется заморачиваться с синтаксисом специально под эту функцию
А разве для неё нужен какой то специальный синтаксис?
 
 Top
Мелкий Супермодератор
Отправлено: 16 Января, 2014 - 19:22:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Misanthropist пишет:
Только думается мне, при большом количестве текста и %шаблонов% это будет чрезвычайно не быстрая операция.

Eval по понятной причине значительно медленнее. И, вдобавок, значительно медленнее нативного кода, т.к eval делает невозможными многие внутренние оптимизации.

Misanthropist пишет:
постоянно переписывать файл мне кажется тоже не очень кошерно.

А БД чем, по вашему, занимается? Точно так же перезаписывает сектора на дисках.


-----
PostgreSQL DBA
 
 Top
Misanthropist
Отправлено: 16 Января, 2014 - 21:35:44
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Ch_chov
Цитата:
А разве для неё нужен какой то специальный синтаксис?


http://ru2.php.net/manual/ru/function.eval.php
Цитата:
Код не должен быть обрамлен открывающимся и закрывающимся тегами PHP, т.е. строка должна быть, например, такой 'echo "Привет!";', но не такой '<? echo "Привет!"; >'. Возможно переключатся между режимами PHP и HTML кода, например 'echo "Код PHP!"; ?>Код HTML<? echo "Снова код PHP!";'.


Мелкий
Цитата:
А БД чем, по вашему, занимается? Точно так же перезаписывает сектора на дисках

Дак я ж в базу писать не собираюсь. Я с нее только читаю.
А запись в файл отнимет время и ресурсы, а также добавит кода. Поэтому и не кошерно.
 
 Top
Panoptik
Отправлено: 16 Января, 2014 - 22:01:50
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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


-----
Just do it
 
 Top
Misanthropist
Отправлено: 16 Января, 2014 - 22:11:12
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Panoptik
Например, при загрузке каждой страницы выводить ip пользователя. Ну, или другие какие-нить данные динамические. Вот как это закешируешь?
 
 Top
Panoptik
Отправлено: 16 Января, 2014 - 22:21:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




тогда str_replace, если так боитесь нагрузки можете клиентом обрабатывать эти данные


-----
Just do it
 
 Top
Мелкий Супермодератор
Отправлено: 16 Января, 2014 - 22:41:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Misanthropist пишет:
Дак я ж в базу писать не собираюсь. Я с нее только читаю.

Ну так. Почему тогда в файл надо писать? И с него только чтение будет.
Где вы тут лишний код нашли - тоже не вполне понимаю. Чего-нибудь надо будет подумать, если перерастёте 1 физический веб-сервер, это да. Ну получится пара строк кода на обработку ситуации "файла нет, утянуть из базы".


-----
PostgreSQL DBA
 
 Top
Misanthropist
Отправлено: 16 Января, 2014 - 23:12:29
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Мелкий
Я наоборот все с файлов в базу запихал, а вы говорите: загоняй обратно в файлы.

Т.е. идея была такая:
файл content.php
при каждом обращении к сайту текст выдергивается из базы и записывается в этот файл.
в представлении я инклюдю только этот файл и все, просто его содержимое постоянно меняется.

чем хорошо: мало файлов
что плохо: файл постоянно перезаписывается

где лишние строки?
либо какой-нить echo $var;
либо открыть файл
вставить данные из $var в файл
закрыть файл

Ну, как минимум на 2 строки больше. Да и не уверен, что это будет быстро работать.
(Добавление)
Panoptik
Посылать шаблон и данные для подстановки пользователю?
 
 Top
Ch_chov
Отправлено: 17 Января, 2014 - 07:17:04
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Misanthropist пишет:
Код не должен быть обрамлен открывающимся и закрывающимся тегами PHP

Ну так эти тэги обычно сразу в eval подставляют:



Вообще смешивать контент и php код не правильно. Потому что это не безопасно. Вы никогда не сможете доверить публикацию такого контенте не проверенным пользователям. Я бы на вашем месте использовал токены, т.е. вставки в специальном формате (например, [user.ip]) и обрабатывал бы их при выводе с помощью callback функций. Можно использовать готовый шаблонизатор. Напрмиер в твиг шаблоне такой текст {{ user.ip }} будет автоматически обработан функцией $user->getIp().
 
 Top
Misanthropist
Отправлено: 17 Января, 2014 - 11:33:33
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Ch_chov
Так вот поэтому и говорю - eval не вариант.

А подскажи по поводу обработки при выводе с помощью callback функций: как организовать вызов callback-функции при выводе?
 
 Top
esterio
Отправлено: 17 Января, 2014 - 11:46:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




eval наверно самое худшее что можна использовать учитивая то, что данные идут с базы.
если вам нужно пользователу предоставить способ подстановки переменных в тексте, то используйте str_replace или preg_replace. А в качестве аргументов передавайте массивы. Чтобы все не тормозило используйте кеширование. маркеры не должны быть ПХП кодом, а иметь специфическый формат (например %var%)

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Template
  3. {
  4.         protected $_data = array();
  5.  
  6.         public function execute($text, array $data)
  7.         {
  8.                 $this->_data = $data;
  9.                 return preg_replace_callback('/%(.+?)%/', array($this, '_replace'), $text);
  10.         }
  11.  
  12.         protected function _replace($data)
  13.         {
  14.                 return isset($this->_data[$data[1]]) ? $this->_data[$data[1]] : $data[0];
  15.         }
  16. }
  17.  
  18. $text = 'Hello %username%';
  19.  
  20. $data = array(
  21.         'username' => 'world'
  22. );
  23.  
  24. $template = new Template();
  25. echo $template->execute($text, $data);
 
 Top
Ch_chov
Отправлено: 17 Января, 2014 - 12:34:57
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




esterio, так ведь это обычный шаблонизатор. К нему данные нужно приготовить заранее. Если на сайте используются сотни токенов то их придется все обработать и передать в шаблон. Не смотря на то, что исходный текст может содержать все 2-3 токена.
 
 Top
esterio
Отправлено: 17 Января, 2014 - 12:39:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




лучше уж так чем eval
 
 Top
Ch_chov
Отправлено: 17 Января, 2014 - 13:28:40
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Лучше вместо для обработки токенов использовать callback фукнции. Т.е. подгружать данные только если они действительно будут выводится.

Другой вариант (пример из друпала): https://api.drupal.org/api/drupal/includes!token.inc/function/token_replace/7
  1. Вытащить из текста регуляркой список токенов
  2. Получить значения этих токенов
  3. Заменить токены на их значения с помощью str_replace
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB