In PHP ist es eine Möglichkeit, die Ausgabe einer PHP-Datei in eine Variable zu erfassen, ohne die Ausgabe-Pufferung verwendet?

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

  •  03-07-2019
  •  | 
  •  

Frage

In PHP, ich möchte eine Datei in eine Variable lesen und die PHP in der Datei in der gleichen Zeit zu verarbeiten, ohne die Ausgabe-Pufferung verwendet wird. Ist das möglich?

Im Wesentlichen das ich möchte in der Lage 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 innerhalb eines Ausgangs Rückruf zu tun (wo Ausgabepufferung nicht erlaubt ist)

War es hilfreich?

Lösung

Ein wenig bekanntes Feature von PHP ist in der Lage, eine enthalten / erforderlich Datei wie ein Funktionsaufruf zu behandeln, mit einem Rückgabewert.

Zum Beispiel:

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


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

Andere Tipps

Von dem, was ich in der PHP-Dokumentation kann sagen, nein. Warum wollen Sie die Ausgabe-Pufferung vermeiden?

Der einzige Weg, dies zu umgehen Hacky Methoden wäre, die entweder über die Befehlszeile php-Client aufrufen oder eine Locke Anfrage zu tun, basierend auf, was verfügbar ist und was die besonderen Anforderungen sind.

alle Vorschläge Nach der Lektüre eine Reihe von Unterlagen zu lesen, und mit einigen Dingen herumspielen, ich kam mit dieser:

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

Es ist so nah wie ich bekommen konnte, aber es hat leider nicht funktioniert. Der Schlüssel dazu ist die Schließung PHP-Bit (?>), bevor der Inhalt der Datei aufzunehmen. Dies wird den eval() von PHP-Bewertungsmodus nehmen und den Inhalt der Datei zunächst als nicht-PHP-Code behandeln. Dann, wenn es PHP-Code-Blöcke innerhalb der Datei sind, werden diese als PHP ausgewertet werden. Die Bummer sind, dass es nicht den eval'd Inhalt in den Variablen nicht speichern, es gibt sie nur auf der Seite.

Danke für die Hilfe alle!

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 ist zu beachten, dass die Ausgabe-Pufferung verwenden wäre einfacher, auf Ressourcen.

Starten Sie eine curl Anfrage an die PHP-Seite im Wesentlichen um den Browser zu sein vorgibt.

Was Sie tun können, wenn die Datei lokal ist, ist das Skript in eine Variable als String laden, dann auf der Saite eval laufen. Dann können Sie danach alle anderen Dinge tun. Andernfalls müssen Sie den Ausgabepuffer verwenden.

$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 seine Ergebnisse zurück fordern, anstatt sie nur echo:

http://us2.php.net/eval

Hack-Alarm! Sie können die Auswertung der PHP selbst mit einem wenig hackery tun preg_replace_callback unter Verwendung der PHP-Blöcke zu suchen und 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;
}

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

So 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 Ihrer enthalten PHP-Datei (oder View-Datei), die Sie so etwas wie dieses haben würde:

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

Ich kann nicht preg_replace_callback Inline-Rückruf bekommen arbeiten, so habe ich eine separate Funktion, aber es ist ein Beispiel dafür, wie es geht: preg_replace_callback () -. Calback innerhalb aktueller Objektinstanz

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top