В PHP я хочу прочитать файл в переменной и одновременно обработать PHP в файле без использования буферизации вывода. Это возможно?
По сути, я хочу сделать это без использования ob_start():
<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>
Возможно ли это в PHP?
Обновление: я хочу сделать некоторые более сложные вещи в обратном вызове вывода (где буферизация вывода не разрешена).






Из того, что я могу сказать в документации по PHP, нет. Почему вы хотите избежать буферизации вывода?
Единственный способ обойти это - хакерские методы, включающие либо вызов php-клиента командной строки, либо выполнение запроса curl в зависимости от того, что доступно и каковы конкретные требования.
Сделайте запрос curl к странице php, по сути, притворившись браузером.
Это не работает, если файл не является общедоступным. См. Ответ Rabbit ... (также file_get_contents проще, чем cURL).
Что вы могли бы сделать, если файл локальный, это загрузить скрипт в переменную в виде строки, а затем запустить eval для этой строки. После этого вы сможете заняться всеми остальными делами. В противном случае вам придется использовать буферизацию вывода.
К сожалению, это не сработает, потому что eval () оценивает код PHP, тогда как доступ к странице будет оценивать код PHP только в том случае, если он находится в блоке кода PHP (например, между <? Php и?>)
Джоэри Себрехтс прав. Эквивалентный и немного более простой метод доступен, если скрипт PHP доступен по протоколу HTTP:
$data = file_get_contents('http://google.com/');
Следует отметить, что использование буферизации вывода упростило бы использование ресурсов.
Многие серверы отключают allow_furl_open, и это не вариант.
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);
Но проверьте документацию по 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, вам все равно придется использовать буферизацию вывода.
@JoeLencioni НЕТ, если вы используете return "blabla" в file.php, то используйте echo eval(...) ............... пожалуйста, отредактируйте свой ответ.
Малоизвестная особенность 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.
Предупреждение о взломе! Вы можете провести оценку 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, поэтому на первом ВОЗВРАЩАТЬСЯ сценарий будет завершен, вместо того, чтобы продолжать его (как будто он мог использовать ЭХО)
Почему бы просто не использовать буферизацию вывода?