В PHP есть ли способ записать вывод файла PHP в переменную без использования буферизации вывода?

В PHP я хочу прочитать файл в переменной и одновременно обработать PHP в файле без использования буферизации вывода. Это возможно?

По сути, я хочу сделать это без использования ob_start():

<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>

Возможно ли это в PHP?

Обновление: я хочу сделать некоторые более сложные вещи в обратном вызове вывода (где буферизация вывода не разрешена).

Почему бы просто не использовать буферизацию вывода?

Greg 21.10.2008 22:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
9
1
14 678
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Единственный способ обойти это - хакерские методы, включающие либо вызов php-клиента командной строки, либо выполнение запроса curl в зависимости от того, что доступно и каковы конкретные требования.

Сделайте запрос curl к странице php, по сути, притворившись браузером.

Это не работает, если файл не является общедоступным. См. Ответ Rabbit ... (также file_get_contents проще, чем cURL).

Niels Abildgaard 27.05.2013 10:59

Что вы могли бы сделать, если файл локальный, это загрузить скрипт в переменную в виде строки, а затем запустить eval для этой строки. После этого вы сможете заняться всеми остальными делами. В противном случае вам придется использовать буферизацию вывода.

К сожалению, это не сработает, потому что eval () оценивает код PHP, тогда как доступ к странице будет оценивать код PHP только в том случае, если он находится в блоке кода PHP (например, между <? Php и?>)

Joe Lencioni 21.10.2008 23:00

Джоэри Себрехтс прав. Эквивалентный и немного более простой метод доступен, если скрипт PHP доступен по протоколу HTTP:

$data = file_get_contents('http://google.com/');

Следует отметить, что использование буферизации вывода упростило бы использование ресурсов.

Многие серверы отключают allow_furl_open, и это не вариант.

dcousineau 22.10.2008 02:28
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

Но проверьте документацию по eval, потому что вам действительно нужно, чтобы вызываемый файл возвращал свои результаты, а не просто отображал их:

http://us2.php.net/eval

Прочитав все предложения, прочитав кучу документации и поэкспериментировав с некоторыми вещами, я пришел к следующему:

<?php
$file = file_get_contents('/path/to/file.php');
$xhtml = eval("?>$file");
?>

Это так близко, насколько я мог, но, к сожалению, не работает. Ключ к этому - включить закрывающий бит PHP (?>) перед содержимым файла. Это выведет eval() из режима оценки PHP и будет обрабатывать содержимое файла, начиная с кода, отличного от PHP. Затем, если в файле есть блоки кода PHP, они будут оцениваться как PHP. Облом заключается в том, что он не сохраняет содержимое eval в переменной, а просто выводит его на страницу.

Всем спасибо за помощь!

И что на самом деле возвращает результат файла eval? Из того, что я прочитал в us.php.net/manual/en/function.eval.php, вам все равно придется использовать буферизацию вывода.

KernelM 22.10.2008 17:10

@JoeLencioni НЕТ, если вы используете return "blabla" в file.php, то используйте echo eval(...) ............... пожалуйста, отредактируйте свой ответ.

T.Todua 03.05.2015 16:04
Ответ принят как подходящий

Малоизвестная особенность PHP - это возможность обрабатывать включенный / требуемый файл как вызов функции с возвращаемым значением.

Например:

// myinclude.php
$value = 'foo';
$otherValue = 'bar';
return $value . $otherValue;


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar

Также уместно то, что переменные, установленные в index.php перед включением, доступны и оцениваются, когда вы включаете myinclude.php.

Duncanmoo 18.08.2013 15:33

Предупреждение о взломе! Вы можете провести оценку PHP самостоятельно, немного взломав, используя preg_replace_callback для поиска и замены блоков PHP.

function evalCallback($matches)
{
    // [0] = <?php return returnOrEcho("hi1");?>
    // [1] = <?php
    // [2] = return returnOrEcho("hi1");
    // [3] = ?>
    return eval($matches[2]);
}

function evalPhp($file)
{
    // Load contents
    $contents = file_get_contents($file);
    // Add returns
    $content_with_returns = str_replace(
                               "returnOrEcho"
                              ,"return returnOrEcho"
                              ,$contents);
    // eval
    $modified_content = preg_replace_callback(
                              array("|(\<\?php)(.*)(\?\>)|"
                             ,"evalCallback"
                             ,$content_with_returns);
    return $modified_content;
}

Вам нужно будет изменить файл PHP, который вы включаете, чтобы использовать функцию returnOrEcho, чтобы его можно было перегрузить в этом случае и в обычном случае. В этом случае вы хотите использовать return, чтобы он принимался eval так, как вы хотите, но обычно это echo без возврата.

Итак, для этого случая вы должны определить:

function returnOrEcho($str)
{
    return $str;
}

а для нормального случая вы должны определить:

function returnOrEcho($str)
{
    echo $str;
}

В вашем включенном файле PHP (или файле просмотра) у вас будет что-то вроде этого:

<?php returnOrEcho("hi1");?>
<?php returnOrEcho("hi3"."oo");?>
<?php returnOrEcho(6*7);?>

Мне не удалось заставить работать встроенный обратный вызов preg_replace_callback, поэтому я использовал отдельную функцию, но есть пример того, как это сделать: preg_replace_callback () - Обратный вызов внутри текущего экземпляра объекта.

как я вижу, вы упустили одну серьезную вещь, и вам нужно это исправить. если в этом файле есть несколько ЭХО, тогда все в порядке, но эта функция заменяет ЭХОs на ВОЗВРАЩАТЬСЯs, поэтому на первом ВОЗВРАЩАТЬСЯ сценарий будет завершен, вместо того, чтобы продолжать его (как будто он мог использовать ЭХО)

T.Todua 12.05.2015 21:11

Другие вопросы по теме