En PHP, ¿hay una manera de capturar la salida de un archivo PHP en una variable sin usar el búfer de salida?

StackOverflow https://stackoverflow.com/questions/222925

  •  03-07-2019
  •  | 
  •  

Pregunta

En PHP, quiero leer un archivo en una variable y procesar el PHP en el archivo al mismo tiempo sin usar el búfer de salida. ¿Es esto posible?

Esencialmente 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 búfer de salida no está permitido).

¿Fue útil?

Solución

Una característica poco conocida de PHP es poder tratar un archivo incluido / requerido como una llamada de 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

Otros consejos

De lo que puedo decir en la documentación de PHP, no. ¿Por qué quieres evitar el búfer de salida?

La única forma de evitar esto sería mediante métodos piratas que involucran invocar al cliente de línea de comandos php o hacer una solicitud de curvatura según lo que esté disponible y cuáles son los requisitos específicos.

Después de leer las sugerencias de todos, leer un montón 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 conseguir pero desafortunadamente no funciona. La clave para esto es incluir el bit de cierre de PHP (? & Gt; ) antes del contenido del archivo. Esto sacará al eval () del modo de evaluación de PHP y tratará los contenidos del archivo que comienzan como código no PHP. Luego, 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 por la ayuda a todos!

Joeri Sebrechts es correcto. Un método equivalente y un poco más sencillo está disponible si el script PHP es accesible mediante HTTP:

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

Se debe tener en cuenta que el uso del búfer de salida sería más fácil en los recursos.

Haz una solicitud de curl a la página de php, esencialmente pretendiendo ser el navegador.

Lo que podría hacer, si el archivo es local, es cargar el script en una variable como una cadena, luego ejecute eval en la cadena. Luego puedes hacer todas tus otras cosas después. De lo contrario, tienes que usar el búfer de salida.

$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

Pero revise la documentación en eval, porque en realidad tiene que hacer que el archivo que está llamando devuelva sus resultados en lugar de solo repetirlos:

http://us2.php.net/eval

¡Alerta Hack! Puede realizar la evaluación del PHP usted mismo con un poco de piratería 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;
}

Tendría que modificar el archivo PHP que está incluyendo para usar una función returnOrEcho para que pueda sobrecargarse en este caso y en el caso normal. En este caso, desea return para que el eval lo recoja de la forma que desee, pero el caso normal es echo Sin devolución.

Entonces, para este caso, definirías:

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

y para el caso normal que definirías:

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

En tu archivo PHP incluido (o en el archivo de visualización) tendrías algo como esto:

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

No pude hacer que funcionara la devolución de llamadas en línea preg_replace_callback , así que usé una función separada, pero hay un ejemplo de cómo hacerlo: preg_replace_callback () - Calback dentro de la instancia de objeto actual .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top