In PHP, c'è un modo per catturare l'output di un file PHP in una variabile senza usare il buffering dell'output?

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

  •  03-07-2019
  •  | 
  •  

Domanda

In PHP, voglio leggere un file in una variabile ed elaborare PHP nel file contemporaneamente senza utilizzare il buffering dell'output. È possibile?

Essenzialmente, voglio essere in grado di farlo senza usare ob_start () :

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

È possibile in PHP?

Aggiornamento: voglio fare alcune cose più complesse all'interno di un callback di output (dove non è consentito il buffering dell'output).

È stato utile?

Soluzione

Una caratteristica poco nota di PHP è quella di poter trattare un file incluso / richiesto come una chiamata di funzione, con un valore di ritorno.

Ad esempio:

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


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

Altri suggerimenti

Da quanto posso dire nella documentazione di PHP, no. Perché vuoi evitare il buffering dell'output?

L'unico modo per aggirare questo sarebbe metodi caotici che coinvolgono o invocare il client php della riga di comando o fare una richiesta di arricciatura in base a ciò che è disponibile e quali sono i requisiti particolari.

Dopo aver letto i suggerimenti di tutti, aver letto un sacco di documentazione e aver giocato con alcune cose, ho pensato a questo:

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

È il più vicino possibile ma purtroppo non funziona. La chiave di ciò è includere il bit PHP di chiusura (? & Gt; ) prima del contenuto del file. Ciò eliminerà eval () dalla modalità di valutazione PHP e tratterà il contenuto del file a partire da un codice non PHP. Quindi se ci sono blocchi di codice PHP all'interno del file, questi verranno valutati come PHP. Il vantaggio è che non salva il contenuto valutato nella variabile, ma lo invia semplicemente alla pagina.

Grazie per l'aiuto a tutti!

Joeri Sebrechts è corretto. Un metodo equivalente e leggermente più semplice è disponibile se lo script PHP è accessibile HTTP:

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

Va ??notato che l'uso del buffering di output sarebbe più semplice per le risorse.

Invia una richiesta di arricciatura alla pagina php, essenzialmente fingendo di essere il browser.

Quello che potresti fare, se il file è locale, è caricare lo script in una variabile come stringa, quindi eseguire eval sulla stringa. Quindi puoi fare tutte le altre cose in seguito. In caso contrario, è necessario utilizzare il buffer di output.

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

Ma controlla la documentazione su eval, perché in realtà devi avere il file che stai chiamando restituire i suoi risultati piuttosto che farli eco:

http://us2.php.net/eval

Hack Alert! Puoi fare tu stesso la valutazione del PHP con un po 'di pirateria informatica usando preg_replace_callback per cercare e sostituire i blocchi 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;
}

Dovresti modificare il file PHP che stai includendo per usare una funzione returnOrEcho in modo che possa essere sovraccaricato in questo caso e nel caso normale. In questo caso si desidera return in modo che venga raccolto da eval nel modo desiderato, ma il caso normale è echo senza ritorno.

Quindi per questo caso definiresti:

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

e per il caso normale definiresti:

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

Nel tuo file PHP incluso (o nel file di visualizzazione) avresti qualcosa del genere:

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

Non sono riuscito a far funzionare preg_replace_callback callback inline, quindi ho usato una funzione separata, ma c'è un esempio di come farlo: preg_replace_callback () - Calback nell'istanza dell'oggetto corrente .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top