tohokuaikiのチラシの裏

技術的ネタとか。

PHPのoutput bufferingの罠

別のサーバーだとheaderの前にエラーが出て「Message: Cannot modify header information - headers already sent by」になって終わっちゃうのに、自分のサーバーだとこれが引っかからなくて不思議だなーって思ってたら

f:id:tohokuaiki:20181107164605p:plain
output.bufferingの値が設定されていた。なんぞこれ。

PHP: 実行時設定 - Manual

output_buffering boolean/integer このディレクティブを 'On' と設定することにより、全てのファイルに 関して出力バッファリングを有効にすることができます。 特定の大きさにバッファの大きさを制限したい場合、このディレクティブの 値として 'On' の代わりに最大バイト数(例:output_buffering=4096) を使用することができます。 PHP-CLI ではこのディレクティブが常に Off となります。

ということ。試しに、var_dump(ob_get_status());exit; してみたら

array(7) {
  ["name"]=>
  string(22) "default output handler"
  ["type"]=>
  int(0)
  ["flags"]=>
  int(20592)
  ["level"]=>
  int(0)
  ["chunk_size"]=>
  int(4096)
  ["buffer_size"]=>
  int(69632)
  ["buffer_used"]=>
  int(0)
}

って出てきた。なー。デフォルトでob_start()してたってことなのね。

.htaccess

php_value output_buffering 0

として対策完了。