PEAK XOOPS - shutdown関数と出力バッファリング関数を両方使った時の非互換性 in englishin japanese

Archive | RSS |
PHP
PHP : shutdown関数と出力バッファリング関数を両方使った時の非互換性
Poster : GIJOE on 2007-03-24 05:50:55 (7958 reads)

in englishin japanese
つい最近ハマったのですが、PHP5.1から、shutdown関数と出力バッファリング関数の両方を使った時の処理順が変更になっているようです。(PHP5.0.x は、PHP4と同じ)

<?php
register_shutdown_function( 'sf' ) ;
ob_start( 'ob' ) ;
echo 'main ' ;

function ob( $s )
{
	return $s.'ob ' ;
}

function sf()
{
	echo 'sf ' ;
}
?>

このコードを実行した時、以下のような結果になります。(すべてcli版でテスト)
PHP4.4.4およびPHP5.0.3
main ob sf 


PHP5.1.3
main sf ob 


後者の場合、shutdown関数の出力も、バッファリングされているわけで、動作としてはまるっきり別のものとなります。

しばし悩みましたが、両者の非互換性を吸収するコードはこんな感じ。

<?php
register_shutdown_function( 'sf' ) ;
ob_start( 'ob' ) ;
echo 'main ' ;

function ob( $s )
{
	return $s.'ob ' ;
}

function sf()
{
	while( @ob_end_flush() ) ;
	echo 'sf ' ;
}
?>

shutdown関数先頭でバッファリングをクリアすることで、PHP5.1未満とPHP5.1以降が同じ処理順になります。(PHP4と同じ順番に統一)

もし、PHP5.1未満をPHP5.1以上の処理順に統一するなら、バッファリング関数内で呼び出すしかないでしょうかね。

0 comments
Printer friendly page Send this story to a friend

Comments list

Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!