9

PHPでファイルを変数に読み込み、ファイル内のPHPを出力バッファリングを使わずに同時に処理したい。これは可能ですか?

基本的に、使用せずにこれを達成できるようにしたいob_start():

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

これはPHPで可能ですか?

更新: 出力コールバック (出力バッファリングが許可されていない場合) 内で、より複雑なことを実行したいと考えています。

4

8 に答える 8

26

PHP のあまり知られていない機能は、戻り値を使用して、関数呼び出しのようにインクルード/必須ファイルを処理できることです。

例えば:

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


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar
于 2008-10-23T10:06:28.800 に答える
9

PHPのドキュメントで私が言えることから、いいえ。出力バッファリングを回避したいのはなぜですか?

これを回避する唯一の方法は、コマンド ライン php クライアントを呼び出すか、使用可能なものと特定の要件に基づいて curl リクエストを実行することを含むハック メソッドです。

于 2008-10-21T18:30:16.723 に答える
4

みんなの提案を読んだり、たくさんのドキュメントを読んだり、いくつか遊んだりした後、私はこれを思いつきました:

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

可能な限り近いですが、残念ながらうまくいきません。?>これの鍵は、ファイルの内容の前にPHP の終了ビット ( ) を含めることです。これeval()により、PHP 評価モードが終了し、ファイルの内容が非 PHP コードとして扱われます。次に、ファイル内に PHP コード ブロックがある場合、それらは PHP として評価されます。残念なことに、評価されたコンテンツを変数に保存せず、ページに出力するだけです。

みんな助けてくれてありがとう!

于 2008-10-21T23:00:18.113 に答える
1

Joeri Sebrechts は正しいです。PHP スクリプトが HTTP でアクセスできる場合は、同等の少し簡単な方法を使用できます。

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

出力バッファリングを使用すると、リソースがより簡単になることに注意してください。

于 2008-10-21T19:06:44.670 に答える
0

ファイルがローカルの場合にできることは、スクリプトを変数に文字列としてロードし、文字列に対して eval を実行することです。その後、他のすべての作業を行うことができます。それ以外の場合は、出力バッファリングを使用する必要があります。

于 2008-10-21T18:50:03.877 に答える
0
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

ただし、eval のドキュメントを確認してください。実際には、呼び出しているファイルが結果をエコーするだけでなく、結果を返す必要があるためです。

http://us2.php.net/eval

于 2008-10-21T22:52:09.720 に答える
0

基本的にブラウザのふりをして、php ページに curl リクエストを実行します。

于 2008-10-21T18:31:25.973 に答える
-1

ハックアラート!preg_replace_callbackPHP ブロックを検索して置換するために少しハッカーを使用して、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;
}

returnOrEchoこのケースと通常のケースでオーバーロードできるように、関数を使用するように含める PHP ファイルを変更する必要があります。この場合はご希望の方法returnで引き取らせてevalいただきたいと思いますが、通常の場合はechoノーリターンとさせていただきます。

したがって、この場合、次のように定義します。

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

通常のケースでは、次のように定義します。

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

インクルードされた PHP ファイル (またはビュー ファイル) には、次のようなものがあります。

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

インライン コールバックを機能させることができなかっpreg_replace_callbackたので、別の関数を使用しましたが、その方法の例があります: preg_replace_callback() - Calback inside current object instance

于 2014-10-30T15:23:01.443 に答える