Реклама на сайте Advertise with us

Вставить текст, который будет интерпретироваться как php?

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

📈sflash.biz

С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 22/10/15 в 20:53       Ответить с цитатойцитата 

Есть некий шаблон, который генерится динамически и вставляется через элементарный echo. Упрощённо:
Код:

<?php
$template = '<html> <?php include 'some.php'; ?> </html>';
echo $template;
?>

После рендеринга этой страницы <?php include 'some.php'; ?> выводится как текст.
Можно как-то устроить, чтоб <?php include 'some.php'; ?> сработал как php без создания дополнительного файла для $template?

1
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 22/10/15 в 21:17       Ответить с цитатойцитата 

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

Грубо говоря:

Код:

ob_start();
// подгрузка твоего темплейта
$out = ob_get_clean();
print eval("return<<<END\n$out\nEND;\n");

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

9
 

programmer

С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760

Ссылка на сообщениеДобавлено: 22/10/15 в 21:28       Ответить с цитатойцитата 

если some.php возвращает текст
Код: [развернуть]

крипта на ByBit

0
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 22/10/15 в 21:30       Ответить с цитатойцитата 

Sterx: содержимое $template неизвестно, а точнее произавольный текст в перемешку с пхп вставками.

0
 



С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970

Ссылка на сообщениеДобавлено: 22/10/15 в 22:00       Ответить с цитатойцитата 

Код: [развернуть]


Как-то так.

8
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 22/10/15 в 22:24       Ответить с цитатойцитата 

gimcnuk: круто! Но результат будет немного не тот
(заменил include на echo для наглядности)
Код: [развернуть]


Цитата:
some.phpsome2.php dfgdg d

А так, конечно, нехилая смекалка! smail54.gif

Последний раз редактировалось: S_Flash (22/10/15 в 22:47), всего редактировалось 2 раз(а)

0
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 22/10/15 в 22:29       Ответить с цитатойцитата 

Странно, чёт я думал будет проще.. Например, в смартсиджее все страницы отдаёт index.php. Темплейты хранятся в базе mysql, в них свободно можно использовать PHP код. Значит ли это, что результаь темплейта генерится и предварительно сохряняется в физический файл, который потом инклудится в index.php? Хотя, мне кажется, что это черезчур ударит по быстродействию.

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 23/10/15 в 00:36       Ответить с цитатойцитата 

S_Flash писал:

Странно, чёт я думал будет проще.. Например, в смартсиджее все страницы отдаёт index.php. Темплейты хранятся в базе mysql, в них свободно можно использовать PHP код. Значит ли это, что результаь темплейта генерится и предварительно сохряняется в физический файл, который потом инклудится в index.php? Хотя, мне кажется, что это черезчур ударит по быстродействию.


Плохость в том, что ты отталкиваешься от изначально дурного. Отбрось eval-ересь, будь мужиком!! Хочешь генерить шаблоны на лету и парсить из строки - генери. Только не в виде исполняемого кода php. Генери шаблоны для шаблонизатора. twig например

apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only

9
 



С нами с 20.02.06
Сообщения: 248
Рейтинг: 366

Ссылка на сообщениеДобавлено: 23/10/15 в 01:19       Ответить с цитатойцитата 

Есть ещё такой вариант, но для него должна быть включена директива allow_url_include (http://fi2.php.net/manual/ru/filesystem.configuration.php#ini.allow-url-include):

Запихать нужные данные в память (php://memory или php://temp), а потом сделать include оттуда.

Но это, конечно, экзотика. Не советовал бы так делать.

8
 



С нами с 09.08.12
Сообщения: 185
Рейтинг: 378

Ссылка на сообщениеДобавлено: 23/10/15 в 08:11       Ответить с цитатойцитата 

johndoe2 писал:
Только не в виде исполняемого кода php. Генери шаблоны для шаблонизатора. twig например

шаблоны php нативны и гораздо лучше чем какие то поделки типа twig

---

php://memory - гарантировано в память
http://php.net/manual/ru/wrappers.php.php
это определенно лучше чем eval - более универсально.

но лучше всетаки хранить такие кеши шаблонов в файлах - если они будут переиспользоватся. тогда при включенном opcache будет лучше производительность.

8
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 23/10/15 в 11:11       Ответить с цитатойцитата 

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 и затем его же инклудить в страницу для отображения и исполнения пхп вставок. Но хер проссышь, как оно работает. Что-то не сильно жалуют это дело примерами в докуентации! icon_smile.gif Сейчас мне это кажется самым не простым способом, хотя изначально я думал именно о нём..

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 23/10/15 в 14:08       Ответить с цитатойцитата 

rickdeckard писал:

шаблоны php нативны и гораздо лучше чем какие то поделки типа twig


Машинные коды нативны и гораздо лучше чем какие то поделки типа X

apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 23/10/15 в 14:14       Ответить с цитатойцитата 

S_Flash писал:

4. Рендер пихать php://memory и затем его же инклудить в страницу для отображения и исполнения пхп вставок. Но хер проссышь, как оно работает. Что-то не сильно жалуют это дело примерами в докуентации! icon_smile.gif Сейчас мне это кажется самым не простым способом, хотя изначально я думал именно о нём..


http://stackoverflow.com/a/2987330

apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only

9
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 23/10/15 в 22:34       Ответить с цитатойцитата 

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;

?>

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 24/10/15 в 19:42       Ответить с цитатойцитата 

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);

apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only

8
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 24/10/15 в 20:37       Ответить с цитатойцитата 

johndoe2: любопытно без "allow_url_include=On"

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 24/10/15 в 21:06       Ответить с цитатойцитата 

S_Flash писал:

johndoe2: любопытно без "allow_url_include=On"


Вместо php://memory можно использовать /dev/shm или /run/shm (SHared Memory). Это файловая система поверх памяти.

Код:

<?php

    $path = '/dev/shm/tmpl.php';
    file_put_contents($path, "<?php echo 'hello'; ?>");
    include $path;
    unlink($path);//!!!!!!!!!!!!!!!!!!!!!!

apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only

8
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »