58

以下のコードはほとんど機能しますが、それは私が実際に意味したことではありません。

ob_start();
echo 'xxx';
$contents = ob_get_contents();
ob_end_clean();
file_put_contents($file,$contents);

もっと自然な方法はありますか?

4

7 に答える 7

130

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 は、これらの定数を新しい記述子に更新しません。また、これらの定数を再定義することは許可されていません (結局のところ、定数と呼ばれているのには理由があります)。

于 2010-09-29T15:17:51.670 に答える
19

これは、元の問題であると思われる 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

于 2012-11-06T23:01:15.790 に答える
9

いいえ、出力バッファリングは最高です。するだけの方が少しいいですが

ob_start();
echo 'xxx';
$contents = ob_get_flush();
file_put_contents($file,$contents);
于 2009-06-02T02:24:21.943 に答える
1

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] は引き続き使用可能

于 2015-09-09T11:02:53.967 に答える
1

これは、私が抱えていた問題(デバッグが必要)に役立つ醜い解決策です。

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 変数を使用しない方がよいことです。しかし、最初から入れる必要はありません。

于 2012-11-25T00:04:06.397 に答える