por - En PHP, ¿hay alguna manera de capturar el resultado de un archivo PHP en una variable sin usar el buffer de salida?
lista de etiquetas php (8)
En PHP, quiero leer un archivo en una variable y procesar el PHP en el archivo al mismo tiempo sin utilizar el buffer de salida. es posible?
Básicamente, quiero poder lograr esto sin usar ob_start()
:
<?php
ob_start();
include ''myfile.php'';
$xhtml = ob_get_clean();
?>
¿Es esto posible en PHP?
Actualización: quiero hacer algunas cosas más complejas dentro de una devolución de llamada de salida (donde el almacenamiento en búfer de salida no está permitido).
Haga una solicitud curl a la página php, esencialmente pretendiendo ser el navegador.
Joeri Sebrechts es correcto. Un método equivalente y un poco más fácil está disponible si el script PHP es accesible por HTTP:
$data = file_get_contents(''http://google.com/'');
Cabe señalar que el uso de almacenamiento en búfer de salida sería más fácil en los recursos.
Lo que podría hacer, si el archivo es local, es cargar el script en una variable como una cadena, luego ejecutar eval en la cadena. Luego puedes hacer todas tus otras cosas después. De lo contrario, debe usar el almacenamiento en búfer de salida.
Por lo que puedo decir en la documentación de PHP, no. ¿Por qué quieres evitar el almacenamiento en búfer de salida?
La única forma de evitar esto serían los métodos maliciosos que implican invocar el cliente de php de la línea de comandos o hacer una solicitud curl en función de lo que está disponible y cuáles son los requisitos particulares.
Después de leer las sugerencias de todos, leer una gran cantidad de documentación y jugar con algunas cosas, se me ocurrió esto:
<?php
$file = file_get_contents(''/path/to/file.php'');
$xhtml = eval("?>$file");
?>
Es lo más cerca que pude, pero desafortunadamente no funciona. La clave para esto es incluir el bit PHP de cierre ( ?>
) Antes del contenido del archivo. Esto sacará el eval()
del modo de evaluación PHP y tratará el contenido del archivo que comienza como código que no es PHP. Entonces, si hay bloques de código PHP dentro del archivo, esos serán evaluados como PHP. Lo malo es que no guarda el contenido evaluado en la variable, simplemente lo envía a la página.
¡Gracias a todos por la ayuda!
Una característica poco conocida de PHP es poder tratar un archivo incluido / requerido como una llamada a función, con un valor de retorno.
Por ejemplo:
// myinclude.php
$value = ''foo'';
$otherValue = ''bar'';
return $value . $otherValue;
// index.php
$output = include ''./myinclude.php'';
echo $output;
// Will echo foobar
$fileData = file_get_contents(''fileOnDisk.php'');
$results = eval($fileData);
Pero consulte la documentación en eval, ya que realmente tiene que hacer que el archivo que está llamando devuelva los resultados en lugar de solo hacerles un eco:
Hackear alerta! Puede hacer la evaluación del PHP usted mismo con un poco de hackeo utilizando preg_replace_callback
para buscar y reemplazar los bloques de 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;
}
returnOrEcho
modificar el archivo PHP que está incluyendo para usar una función returnOrEcho
para que se pueda sobrecargar en este caso y en el caso normal. En este caso, desea return
para que el eval
la eval
de la manera que desee, pero el caso normal es echo
sin retorno.
Entonces, para este caso definirías:
function returnOrEcho($str)
{
return $str;
}
y para el caso normal definirías:
function returnOrEcho($str)
{
echo $str;
}
En su archivo PHP incluido (o archivo de vista), tendría algo como esto:
<?php returnOrEcho("hi1");?>
<?php returnOrEcho("hi3"."oo");?>
<?php returnOrEcho(6*7);?>
No pude obtener la devolución de llamada en línea preg_replace_callback
así que utilicé una función separada, pero hay un ejemplo de cómo hacerlo: preg_replace_callback () - Calback dentro de la instancia del objeto actual .