PHPでファイルを変数に読み込み、ファイル内のPHPを出力バッファリングを使わずに同時に処理したい。これは可能ですか?
基本的に、使用せずにこれを達成できるようにしたいob_start()
:
<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>
これはPHPで可能ですか?
更新: 出力コールバック (出力バッファリングが許可されていない場合) 内で、より複雑なことを実行したいと考えています。
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 の終了ビット ( ) を含めることです。これeval()
により、PHP 評価モードが終了し、ファイルの内容が非 PHP コードとして扱われます。次に、ファイル内に PHP コード ブロックがある場合、それらは PHP として評価されます。残念なことに、評価されたコンテンツを変数に保存せず、ページに出力するだけです。
みんな助けてくれてありがとう!
Joeri Sebrechts は正しいです。PHP スクリプトが HTTP でアクセスできる場合は、同等の少し簡単な方法を使用できます。
$data = file_get_contents('http://google.com/');
出力バッファリングを使用すると、リソースがより簡単になることに注意してください。
ファイルがローカルの場合にできることは、スクリプトを変数に文字列としてロードし、文字列に対して eval を実行することです。その後、他のすべての作業を行うことができます。それ以外の場合は、出力バッファリングを使用する必要があります。
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);
ただし、eval のドキュメントを確認してください。実際には、呼び出しているファイルが結果をエコーするだけでなく、結果を返す必要があるためです。
基本的にブラウザのふりをして、php ページに curl リクエストを実行します。
ハックアラート!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 ファイルを変更する必要があります。この場合はご希望の方法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。