2008-10-21 13 views
10

En PHP, quiero leer un archivo en una variable y procesar el PHP en el archivo al mismo tiempo sin utilizar el búfer de salida. es posible?En PHP, ¿hay alguna forma de capturar el resultado de un archivo PHP en una variable sin utilizar el almacenamiento en búfer de salida?

Esencialmente Quiero ser capaz de 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 no está permitido el almacenamiento en búfer de salida).

+0

¿Por qué no utilizar el buffer de salida? – Greg

Respuesta

25

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 
+0

Muy, muy útil. Gracias. – ppp

+0

¡Eso es brillante! – LoneWOLFs

+1

También es pertinente que las variables establecidas en index.php antes de la inclusión estén disponibles y se evalúen cuando se incluye myinclude.php. – Duncanmoo

9

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 línea de comando php o hacer una solicitud curl en función de lo que está disponible y cuáles son los requisitos particulares.

+0

Eso es algo de lo que tenía miedo :(¡Gracias! –

0

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

+0

Esto no funciona si el archivo no es de acceso público. Consulte la respuesta de Rabbit ... (también 'file_get_contents' es más fácil que cURL). –

0

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, debe usar el almacenamiento en búfer de salida.

+0

Desafortunadamente, eso ganó no funciona porque eval() evalúa código PHP mientras que acceder a una página solo evaluará el código PHP si está en un bloque de código PHP (por ejemplo, entre ) –

1

Joeri Sebrechts es correcto. un método equivalente y ligeramente más fácil está disponible si el script PHP es accesible HTTP:

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

Cabe señalar que el uso de búferes de salida sería más fácil en los recursos.

+0

Muchos servidores deshabilitan allow_furl_open y esto no será una opción. – dcousineau

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

, pero echa la documentación sobre eval, porque en realidad se tiene que tener el archivo que está llamando devolver sus resultados en lugar de simplemente eco:

http://us2.php.net/eval

6

Después de leer las sugerencias de todo el mundo, la lectura de un montón de documentación, y jugando 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 lamentablemente 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 por la ayuda a todos!

+4

Y eso en realidad devuelve el resultado del archivo evaluado? Por lo que leí en http://us.php.net/manual/en/function.eval.php aún necesitaría usar el buffer de salida. – KernelM

+0

Dang, supongo que tú 'a la derecha. :( –

+0

@JoeLencioni ** NO **, si usa 'return" blabla "' en ** file.php **, entonces use 'echo eval (...)' ...... ......... por favor, edite su respuesta. –

-1

Hack Alerta! Puede hacer la evaluación del PHP usted mismo con un poco de hackeo usando 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; 
} 

Usted tendría que modificar el archivo PHP que está incluyendo a utilizar una función returnOrEcho de modo que pueda ser sobrecargado para este caso y el caso normal. En este caso, quiere return para que sea recogido por eval de la manera que desee, pero el caso normal es echo sin devolución.

Así que para este caso, debe definir:

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

y para el caso normal, debe definir:

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

En su archivo PHP incluido (o archivo de vista) que tendría algo así como esto:

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

no pude conseguir preg_replace_callback línea de devolución de llamada a trabajar por lo que utilizó un función separada, pero hay un ejemplo de cómo hacerlo: preg_replace_callback() - Calback inside current object instance.

+0

como veo, te has perdido una cosa seria, y necesitas modificar eso. si en ese archivo, hay varios ** ECHO **, entonces está bien, pero esa función reemplaza a ** ECHO ** s con ** RETURN ** s, por lo que en el primer ** RETORNO ** el script será finalizado, en lugar de continuarlo (como si hubiera estado usando ** ECHO **) –

Cuestiones relacionadas