Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Вставить текст, который будет интерпретироваться как php?
Новая тема
Ответить
цитата
22/10/15 в 20:53
S_Flash
Есть некий шаблон, который генерится динамически и вставляется через элементарный echo. Упрощённо:
Код:
<?php
$template = '<html> <?php include 'some.php'; ?> </html>';
echo $template;
?>
После рендеринга этой страницы <?php include 'some.php'; ?> выводится как текст.
Можно как-то устроить, чтоб <?php include 'some.php'; ?> сработал как php без создания дополнительного файла для $template?
цитата
22/10/15 в 21:17
Stek
Имхо только рендеринг менять, вывод записывая в буффер а потом результат пропускать через eval и уже его отображать.
Грубо говоря:
Код:
ob_start();
// подгрузка твоего темплейта
$out = ob_get_clean();
print eval("return<<<END\n$out\nEND;\n");
цитата
22/10/15 в 21:28
Sterx
если some.php возвращает текст
<?php
$template = '<html>';
$template .= include 'some.php';
$template .= '</html>'
echo $template;
?>
цитата
22/10/15 в 21:30
S_Flash
Sterx:
содержимое $template неизвестно, а точнее произавольный текст в перемешку с пхп вставками.
цитата
22/10/15 в 22:00
Alexandur
ini_set('display_errors',1);
error_reporting(E_ALL);
$template = "<html> <?php include 'some.php'; ?>dfgdg d<?php include 'some2.php'; ?> </html>";
//echo $template;
function evalo($matches)
{
return eval($matches[1]);
}
echo preg_replace_callback('/<\?php(.*?)\?>/', 'evalo', $template);
Как-то так.
цитата
22/10/15 в 22:24
S_Flash
gimcnuk:
круто! Но результат будет немного не тот
(заменил include на echo для наглядности)
$template = "<html> <?php echo 'some.php'; ?>dfgdg d<?php echo 'some2.php'; ?> </html>";
function evalo($matches)
{
return eval($matches[1]);
}
echo preg_replace_callback('/<\?php(.*?)\?>/', 'evalo', $template);
Цитата:
some.phpsome2.php dfgdg d
А так, конечно, нехилая смекалка!
Последний раз редактировалось: S_Flash (
22/10/15 в 22:47
), всего редактировалось 2 раз(а)
цитата
22/10/15 в 22:29
S_Flash
Странно, чёт я думал будет проще.. Например, в смартсиджее все страницы отдаёт index.php. Темплейты хранятся в базе mysql, в них свободно можно использовать PHP код. Значит ли это, что результаь темплейта генерится и предварительно сохряняется в физический файл, который потом инклудится в index.php? Хотя, мне кажется, что это черезчур ударит по быстродействию.
цитата
23/10/15 в 00:36
johndoe2
S_Flash писал:
Странно, чёт я думал будет проще.. Например, в смартсиджее все страницы отдаёт index.php. Темплейты хранятся в базе mysql, в них свободно можно использовать PHP код. Значит ли это, что результаь темплейта генерится и предварительно сохряняется в физический файл, который потом инклудится в index.php? Хотя, мне кажется, что это черезчур ударит по быстродействию.
Плохость в том, что ты отталкиваешься от изначально дурного. Отбрось eval-ересь, будь мужиком!! Хочешь генерить шаблоны на лету и парсить из строки - генери. Только не в виде исполняемого кода php. Генери шаблоны для
шаблонизатора
. twig например
цитата
23/10/15 в 01:19
CABMIT
Есть ещё такой вариант, но для него должна быть включена директива allow_url_include (http://fi2.php.net/manual/ru/filesystem.configuration.php#ini.allow-url-include):
Запихать нужные данные в память (php://memory или
php://temp)
, а потом сделать include оттуда.
Но это, конечно, экзотика. Не советовал бы так делать.
цитата
23/10/15 в 08:11
rickdeckard
johndoe2 писал:
Только не в виде исполняемого кода php. Генери шаблоны для шаблонизатора. twig например
шаблоны php нативны и гораздо лучше чем какие то поделки типа twig
---
php://memory
- гарантировано в память
http://php.net/manual/ru/wrappers.php.php
это определенно лучше чем eval - более универсально.
но лучше всетаки хранить такие кеши шаблонов в файлах - если они будут переиспользоватся. тогда при включенном opcache будет лучше производительность.
цитата
23/10/15 в 11:11
S_Flash
rickdeckard писал:
но лучше всетаки хранить такие кеши шаблонов в файлах - если они будут переиспользоватся. тогда при включенном opcache будет лучше производительность.
Собираюсь хранить кеш в redis поэтому не стал заморачиваться с генерацией шаблонов в файлы с последующим инклудом.
Для себя выделил пока несколько юзабельных вариантов:
1. Подгрузить и исполнить(PHP) сырой темплейт в ob_start(); ob_get_clean(); Взять испоkненный вариант из буфера, обработать и отдать рендер в редис и на страницу браузера.
2. После тектовой обработки шаблона, сохранять его в файл и инклудить в основную страницу.
Ситуация обратная той, что в пункте 1. Тут можно юзать файловый кеш или прийдётся вывод шаблона оборачивать ob_start(); ob_get_clean(); дабы запихнуть рендер в редис! Если использовать редис, то не очень выгодно в сравнении с п1, так как будет лишняя работа по записи на диск.
3. Дополнить шаблонизатор ограниченным набором тегов и избежать вставок PHP вовсе. Критический и самый легкореализуемый тег, который нужен в шаблонах - это include. Проблема в изобретении шиблонизатора нанётся, если понядобятся if else! Сторонний шаблонизатор будет излишен.
4. Рендер пихать
php://memory
и затем его же инклудить в страницу для отображения и исполнения пхп вставок. Но хер проссышь, как оно работает. Что-то не сильно жалуют это дело примерами в докуентации!
Сейчас мне это кажется самым не простым способом, хотя изначально я думал именно о нём..
цитата
23/10/15 в 14:08
johndoe2
rickdeckard писал:
шаблоны php нативны и гораздо лучше чем какие то поделки типа twig
Машинные коды нативны и гораздо лучше чем какие то поделки типа X
цитата
23/10/15 в 14:14
johndoe2
S_Flash писал:
4. Рендер пихать
php://memory
и затем его же инклудить в страницу для отображения и исполнения пхп вставок. Но хер проссышь, как оно работает. Что-то не сильно жалуют это дело примерами в докуентации!
Сейчас мне это кажется самым не простым способом, хотя изначально я думал именно о нём..
http://stackoverflow.com/a/2987330
цитата
23/10/15 в 22:34
S_Flash
johndoe2:
Непонятен именно момент как это добро пустит на интерпретацию php
Код:
<?php
$path = 'php://memory';
$h = fopen($path, "rw+");
fwrite($h, "<?php echo 'hello'; ?>");
fseek($h, 0);
//echo stream_get_contents($h);
//include $h;
?>
цитата
24/10/15 в 19:42
johndoe2
S_Flash писал:
johndoe2:
Непонятен именно момент как это добро пустит на интерпретацию php
Код:
<?php
$path = 'php://memory';
$h = fopen($path, "rw+");
fwrite($h, "<?php echo 'hello'; ?>");
fseek($h, 0);
//echo stream_get_contents($h);
//include $h;
?>
Можно без memory, но в php.ini должно быть allow_url_include=On
Код:
$tmpl = "<?php echo 'hello'; ?>";
include 'data://text/plain;base64,'.base64_encode($tmpl);
цитата
24/10/15 в 20:37
S_Flash
johndoe2:
любопытно без "allow_url_include=On"
цитата
24/10/15 в 21:06
johndoe2
S_Flash писал:
johndoe2:
любопытно без "allow_url_include=On"
Вместо
php://memory
можно использовать /dev/shm или /run/shm (
SH
ared
M
emory). Это файловая система поверх памяти.
Код:
<?php
$path = '/dev/shm/tmpl.php';
file_put_contents($path, "<?php echo 'hello'; ?>");
include $path;
unlink($path);//!!!!!!!!!!!!!!!!!!!!!!
Новая тема
Ответить
Эта страница в полной версии