Включить использование строки, а не имени файла

Я хотел бы запустить include в строке, а не в файле, но не знаю, как этого добиться.

//This is the desired functionality
include($filename);

//But I want to do something like this instead.
$file_contents = getFileFromCacheOrSomewhereElse($filename);
include($file_contents);  // Doens't work...
eval($file_contents);     // Also incorrect.

Обратите внимание: «eval» — это не то же самое, что include — «include» отображает содержимое файла (и выполняет любые теги PHP), в то время как «eval» выполняет строку как PHP-код.

Пример использования — загрузка файла шаблона из Memcache (в виде строки), а затем запуск включения для этой строки вместо запуска включения и использования файлового кеша PHP.


person TempAccount12345    schedule 07.09.2011    source источник
comment
вы не можете просто использовать apc для кеша байт-кода? или кэшировать оцененный шаблон?   -  person Gordon    schedule 07.09.2011
comment
возможный дубликат Возможно ли выполнить строку php?   -  person ircmaxell    schedule 07.09.2011


Ответы (3)


Если вы можете on изменить настройки allow_url_fopen и allow_url_include php.ini, альтернативой является data оболочка потока (руководство).

include 'data:text/plain,' . urlencode($file_contents);
person salathe    schedule 07.09.2011

eval("?>" . $file_contents . "<?php ");

Имеет ли это.

person Moritz Both    schedule 07.09.2011
comment
Вы уверены, что в этом случае eval эквивалентно включению? Есть много вещей, которые следует учитывать: переменная область видимости, обработка ошибок и т. д. - person TempAccount12345; 07.09.2011
comment
Нет я не. Я только что проверил приведенную выше строку и подумал, что этого, вероятно, достаточно для ваших целей. Хотя я бы подумал с точки зрения переменной области, она эквивалентна (без изменения области). Обработка ошибок, вероятно, будет другой. - person Moritz Both; 07.09.2011
comment
Работает ли это с файлами, которые не содержат закрывающий тег ?›? - person Grzegorz Adam Kowalski; 28.02.2016

Хранить PHP-код в кэше памяти — не лучшая идея.
А анализировать его после этого — еще хуже.

Любой кеш кода операции, APC или EAccelerator будет кэшировать ваши файлы PHP на лету, без каких-либо странных усилий, подобных этому, и даже анализировать их для более быстрого выполнения.

РЕДАКТИРОВАТЬ. Учитывая результаты голосования спустя столько лет, я предполагаю, что этот вопрос привлекает только нубов, у которых такой же странный каприз. Так что я должен повторить: хотя это побеждает вашу блестящую идею,

просто оставьте свои включения как есть

Они будут намного лучше кэшироваться и выполняться гораздо быстрее благодаря внутреннему PHP-кэшу кода операции. .

person Your Common Sense    schedule 07.09.2011
comment
Спасибо за ваш вклад. Приятно знать, что кеширование шаблонов, например, — плохая идея, если доступен кеш кода операции. Но это не ответ на мой вопрос :) - person TempAccount12345; 07.09.2011