以下のコードはほとんど機能しますが、それは私が実際に意味したことではありません。
ob_start();
echo 'xxx';
$contents = ob_get_contents();
ob_end_clean();
file_put_contents($file,$contents);
もっと自然な方法はありますか?
PHP では STDOUT をファイルに直接書き込むことができます。これは、出力バッファリングを使用するよりもはるかに簡単で簡単です。
スクリプトの冒頭でこれを行います。
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('application.log', 'wb');
$STDERR = fopen('error.log', 'wb');
なぜあなたは最初に尋ねることができるのですか?標準入力、出力、およびエラー ファイル記述子を閉じると、最初の 3 つの新しい記述子が新しい標準入力、出力、およびエラー ファイル記述子になるため、ファイル記述子はまだ開いてはなりません。
この例では、標準入力を /dev/null にリダイレクトし、出力およびエラー ファイル記述子をログ ファイルにリダイレクトしました。これは、PHP でデーモン スクリプトを作成する場合の一般的な方法です。
application.logファイルに書き込むには、これで十分です。
echo "Hello world\n";
error.logに書き込むには、次のようにする必要があります。
fwrite($STDERR, "Something went wrong\n");
入力、出力、およびエラー記述子を変更すると、組み込みの PHP 定数である STDIN、STDOUT、および STDERR が使用できなくなることに注意してください。PHP は、これらの定数を新しい記述子に更新しません。また、これらの定数を再定義することは許可されていません (結局のところ、定数と呼ばれているのには理由があります)。
これは、元の問題であると思われる OUTPUT を流用する方法です
$ob_file = fopen('test.txt','w');
function ob_file_callback($buffer)
{
global $ob_file;
fwrite($ob_file,$buffer);
}
ob_start('ob_file_callback');
詳細はこちら:
http://my.opera.com/zomg/blog/2007/10/03/how-to-easy-redirect-php-output-to-a-file
いいえ、出力バッファリングは最高です。するだけの方が少しいいですが
ob_start();
echo 'xxx';
$contents = ob_get_flush();
file_put_contents($file,$contents);
Eio拡張機能をインストールできます
pecl インストール eio
ファイル記述子を複製します
$temp=fopen('/tmp/my_stdout','a');
$my_data='my something';
$foo=eio_dup2($temp,STDOUT,EIO_PRI_MAX,function($data,$esult,$request){
var_dump($data,$esult,$request);
var_dump(eio_get_last_error($request));
},$my_data);
eio_event_loop();
echo "something to stdout\n";
fclose($temp);
これにより、新しいファイル記述子が作成され、STDOUT のターゲット ストリームが書き換えられます
これはSTDERRでも実行できます
および定数 STD[OUT|ERR] は引き続き使用可能
これは、私が抱えていた問題(デバッグが必要)に役立つ醜い解決策です。
if(file_get_contents("out.txt") != "in progress")
{
file_put_contents("out.txt","in progress");
$content = file_get_contents('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
file_put_contents("out.txt",$content);
}
その主な欠点は、 $_POST 変数を使用しない方がよいことです。しかし、最初から入れる必要はありません。