PHPでは、出力バッファリングを使用せずにPHPファイルの出力を変数にキャプチャする方法はありますか?

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

  •  03-07-2019
  •  | 
  •  

質問

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

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

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

これはPHPで可能ですか?

更新:出力コールバック内でさらに複雑なことを行いたい(出力バッファリングが許可されていない場合)。

役に立ちましたか?

解決

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

例:

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


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

他のヒント

PHPのドキュメントで説明できることから、いいえ。なぜ出力バッファリングを避けたいのですか?

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

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

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

これは私が手に入れることができるほど近いものですが、残念ながら機能しません。これの鍵は、ファイルの内容の前に終了PHPビット(?&gt; )を含めることです。これにより、 eval()がPHP評価モードから抜け出し、ファイルの内容がPHP以外のコードとして処理されます。次に、ファイル内にPHPコードブロックがある場合、それらはPHPとして評価されます。残念なことに、評価されたコンテンツは変数に保存されず、ページに出力されるだけです。

皆さんの助けに感謝します!

Joeri Sebrechtsは正しいです。 PHPスクリプトがHTTPアクセス可能であれば、同等のやや簡単な方法が利用可能です。

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

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

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

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

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

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

http://us2.php.net/eval

ハックアラート! preg_replace_callback を使用してPHPブロックを検索および置換することにより、ご自身で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ファイルを変更する必要があります。この場合、 eval が望む方法で取得できるように return したいのですが、通常は 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()-現在のオブジェクトインスタンス内のカルバック

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top