私はちょっと奇妙なことに気づいた。私はPHPのマニュアルが言うように任意の出力がブラウザに送信される前に、session_start()
を呼び出さなければなりません、と思った:出力が送信された後、session_start()が機能する
は、クッキーベースのセッションを使用するには、のsession_start()がブラウザに何かをoutputing前に呼び出す必要があります。
私は好奇心のために、2つのスクリプトを作成しました。一つは、write.phpです:
<?php
echo 'foo';
session_start();
$_SESSION['bar'] = 'baz';
?>
そしてもう一つは、read.phpです:
<?php
echo 'foo';
session_start();
var_dump($_SESSION['bar']);
?>
そして驚くべきことに、セッションが書かれており、echo
がFOOをINGの後でさえも読まれます。
しかし、私はecho
秒後flush()
への呼び出しを追加した場合、Apacheのエラーログレポート:
[2012火1月3日11時57分21秒] [エラー] [クライアント127.0.0.1] PHP警告:session_start():セッションキャッシュリミッタを送信できません - すでに5行目の/var/www/sessions/write.phpに送信されています [Tue Jan 03 11:57:21 2012] [エラー] [クライアント127.0.0.1] PHPスタックトレース: [Tue Jan 03 11:57:21 2012] [エラー] [クライアント127.0.0.1] PHP 1. {main}()/var/www/sessions/write.php:0 [Tue Jan 03 11:57:21 2012] [エラー] [クライアント127.0.0.1] PHP 2. session_start()/var/www/sessions/write.php:5
私の質問は次のとおりです。echo
の後にセッションが正しく書かれているのはなぜですか?それはすぐにブラウザに送信されますか?もしそうなら、前にflush()
と呼んでいない限りどこでもセッションを始めることができますか?
[Google "PHP出力バッファリング"](http://www.google.com/search?q=php+output+buffering) – DaveRandom