2008-10-21 11 views
10

In PHP möchte ich eine Datei in eine Variable lesen und die PHP in der Datei gleichzeitig verarbeiten, ohne Ausgabepufferung zu verwenden. Ist das möglich?Gibt es in PHP eine Möglichkeit, die Ausgabe einer PHP-Datei in eine Variable zu erfassen, ohne Ausgabepufferung zu verwenden?

Grunde möchte ich in der Lage sein, dies zu erreichen, ohne ob_start() mit:

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

Ist das möglich in PHP?

Update: Ich möchte einige komplexere Dinge in einem Ausgabe-Callback (wo Ausgabe Pufferung ist nicht erlaubt).

+0

Warum nicht einfach die Ausgabepufferung verwenden? – Greg

Antwort

25

Eine wenig bekannte Eigenschaft von PHP ist es, eine enthaltene/erforderliche Datei wie einen Funktionsaufruf mit einem Rückgabewert zu behandeln.

Zum Beispiel:

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


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

Sehr, sehr nützlich. Vielen Dank. – ppp

+0

Das ist brilliant! – LoneWOLFs

+1

Ebenfalls relevant ist, dass Variablen, die in der index.php vor dem Include gesetzt sind, verfügbar sind und ausgewertet werden, wenn Sie myinclude.php einbinden. – Duncanmoo

9

Von dem, was ich in der PHP-Dokumentation feststellen kann, nein. Warum möchten Sie die Pufferung von Ausgaben vermeiden?

Die einzige Möglichkeit, dies zu umgehen, wären Hacky-Methoden, die entweder den Kommandozeilen-PHP-Client aufrufen oder eine CURL-Anfrage basierend auf dem, was verfügbar ist und was die besonderen Anforderungen sind.

+0

Das ist irgendwie was ich hatte Angst :(Danke! –

0

Eine CURL-Anfrage an die PHP-Seite machen, im Wesentlichen vorgeben, der Browser zu sein.

+0

Dies funktioniert nicht, wenn die Datei nicht öffentlich zugänglich ist. Siehe die Antwort von Rabbit ... (auch 'file_get_contents' ist einfacher als cURL). –

0

Was Sie tun könnten, wenn die Datei lokal ist, lädt das Skript in eine Variable als Zeichenfolge, dann führen Sie Eval auf die Zeichenfolge. Dann kannst du danach alle deine anderen Sachen machen. Andernfalls müssen Sie die Ausgabepufferung verwenden.

+0

Leider gewann das funktioniert nicht, weil eval() PHP-Code auswertet, während der Zugriff auf eine Seite nur den PHP-Code auswertet, wenn er sich in einem PHP-Codeblock befindet (zB zwischen ) –

1

Joeri Sebrechts ist richtig. Eine äquivalente und etwas einfachere Methode ist verfügbar, wenn der PHP-Skript ist HTTP zugänglich:

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

Es soll beachtet werden, dass die Ausgabe-Pufferung mit einfacher auf Ressourcen wäre.

+0

Viele Server deaktivieren allow_furl_open und das ist keine Option – dcousineau

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

Aber prüfen Sie die Dokumentation auf eval, da Sie die Datei tatsächlich haben müssen Sie vielmehr ihre Ergebnisse zurück fordern als Echo sie nur:

http://us2.php.net/eval

6

Nachdem alle Vorschläge zu lesen, eine Lesung Eine Menge Dokumentation, und herumspielen mit ein paar Sachen, ich kam mit diesem:

Es ist so nah wie möglich aber es funktioniert leider nicht. Der Schlüssel dazu ist das Schließen des PHP-Bits (?>) vor dem Inhalt der Datei. Dies wird den eval() aus dem PHP-Evaluierungsmodus nehmen und den Inhalt der Datei als nicht-PHP-Code behandeln. Wenn PHP-Code-Blöcke in der Datei vorhanden sind, werden diese als PHP ausgewertet. Der Nachteil ist, dass der Inhalt in der Variable nicht gespeichert wird, sondern nur auf der Seite ausgegeben wird.

Danke für die Hilfe alle!

+4

Und das tatsächlich Gibt die Ausgabe der eval'd-Datei zurück? Von dem, was ich unter http://us.php.net/manual/en/function.eval.php gelesen habe, müßtest du immer noch die Ausgabepufferung benutzen: – KernelM

+0

Dang, schätze ich genau richtig. :( –

+0

@JoeLencioni ** NEIN **, wenn du 'return" blabla "' in ** file.php ** verwendest, dann benutze 'echo eval (...)' ...... ......... bitte, bearbeiten Sie Ihre Antwort. –

-1

Hack-Alarm! Sie könnten die Auswertung des PHP selbst mit ein wenig Hacker machen, indem Sie preg_replace_callback verwenden, um die PHP-Blöcke zu suchen und zu ersetzen.

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; 
} 

Sie würden die PHP-Datei ändern müssen Sie eine returnOrEcho Funktion zu verwenden, einschließlich, so dass es für diesen Fall und der Normalfall überlastet werden kann. In diesem Fall möchten Sie return, so dass es von der eval in der Art, wie Sie wollen, abgeholt werden, aber der Normalfall ist echo ohne eine Rückkehr. Also für diesen Fall

würden Sie definieren:

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

und für den Normalfall würden Sie definieren:

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

In Ihrem enthalten PHP-Datei (oder View-Datei), die Sie würde so etwas wie dies:

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

konnte ich nicht preg_replace_callback Inline-Rückruf Arbeits so habe ich eine separate Funktion, aber es gibt ein Beispiel, wie es geht: preg_replace_callback() - Calback inside current object instance.

+0

wie ich sehe, haben Sie eine ernste Sache verpasst, und Sie müssen das ändern. Wenn in dieser Datei mehrere ** ECHO ** sind, dann ist es in Ordnung, aber diese Funktion ersetzt ** ECHO ** s durch ** RETURN ** s, also wird beim ersten ** RETURN ** das Skript sein beendet, anstatt es fortzusetzen (wie es hätte sein können ** ** ECHO **) –