PHPでは、出力バッファリングを使用せずにPHPファイルの出力を変数にキャプチャする方法はありますか?
-
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のドキュメントを確認してください。呼び出しているファイルに結果を返すだけでなく、実際に結果を返す必要があるためです。
ハックアラート! 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()-現在のオブジェクトインスタンス内のカルバック。