今日、同僚と fflush 関数の役割について議論しました。私は、PHP のファイル システム機能はシステムの標準 I/O ライブラリ上に構築されるべきだと考えました。そのため、fflush の関数はバッファをフラッシュすることであると勝手に信じていました。標準 I/O ライブラリの fflush 関数に相当します....
後でコードをトレースしたところ、結果が大きく異なることがわかりました...
まずは結果について話しましょう:
1. PHP のファイルシステム関数(fopen、fwrite、fread、fseek など)を通常のファイルに適用すると、内部では open、write、read、seek などのシステムコールが使用され、システムコールを経由せずに処理されます。標準 I/O ライブラリ。
2. fflush 関数は、通常のファイルに適用しても効果がありません。
追跡プロセス:
ext/standard/file.c の
から
PHP_NAMED_FUNCTION(php_if_fopen)
エントリポイントとして、最後に main/streams/plain_wrapper.c で次の定義を見つけます
PHPAPI php_stream_ops php_stream_stdio_ops = {
php_stdiop_write、php_stdiop_read、
php_stdiop_close、php_stdiop_flush、
「STDIO」、
php_stdiop_seek、
php_stdiop_cast、
php_stdiop_stat、
php_stdiop_set_option
};
これは、通常のファイルに適用される主要なファイル システム関数の基礎となる実装です
例として php_stdiop_flush (PHP ユーザー モードの fflush に相当) を取り上げます。
static int php_stdiop_flush(php_stream *stream TSRMLS_DC)
{
php_stdio_stream_data *data = (php_stdio_stream_data*)stream->abstract;
アサート(データ!= NULL);
/*
* stdio は fflush(3) を呼び出すことでデータをユーザーランドにバッファーします。
* データは write(2) を使用してカーネルに送信されます。* 全く違うものです
*/
If (データ->ファイル) {
return fflush(data->file);
}0 を返す
}
通常のファイルの初期化プロセス中 (オープンプロセスを追跡するとわかります)、data->file フィールドは設定されませんが、data->fd が使用されます。
したがって、fflush はここでは呼び出されません。つまり、fflush が通常のファイルで使用されても効果はありません。
著者: selfimpr メール: lgg860911@yahoo.com.cn
http://www.bkjia.com/PHPjc/478561.html
www.bkjia.com
true