2012-01-03 15 views
3

私はちょっと奇妙なことに気づいた。私は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']); 
?> 

そして驚くべきことに、セッションが書かれており、echoFOOを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()と呼んでいない限りどこでもセッションを始めることができますか?

+5

[Google "PHP出力バッファリング"](http://www.google.com/search?q=php+output+buffering) – DaveRandom

答えて

6

cookieベースのセッションを使用するには、 がブラウザに何かを出力する前にsession_start()を呼び出す必要があります。

これは本当です。サーバー側のCookie設定(JavaScript Cookie設定とは異なります)は、HTTPヘッダーを送信することによって機能します。 HTTPヘッダーは実際の文書の前に置かれます。文書の送信を開始すると、ヘッダーを追加する場所がありません。あなたのケースでは

、何が起こるかは、この行ということです:

echo 'foo'; 

...が実際にブラウザに出力を送信しません。代わりに、後で送信されるキューに出力を追加します。 PHPインタープリタは、特定のイベントが発生するまでこの出力を保持するように設定されています(スクリプトが終了するか、キューが一定のサイズに達する可能性があります)。

output_bufferingの疑いがあります。

+0

'' 'output_buffering'''は' '' 4096'''に設定され、 '' implicit_flush'''は '' Off'''です。ですから、スクリプトを '' flush() ''を呼び出さなくても動作させないためには、 '' implicit_flush'''を有効にし、 '' output_buffering'''を '' 0 '' '、そう? –

0

session_start()のこのエラーは、まだ開いているセッションがないことを意味しません。このメソッドは新しいセッションIDを作成しようとしていますが、既に作成できます。これらのスクリプトを実行する前に、すべてのCookieを削除してみてください。

+0

でした。私は '' '' 'PHPSESSID'''を削除してスクリプトを再実行しました。同じことが起こりました:' '' echo'''の後ろに '' flush() ''を追加すると** read.php **表示** NULL **私はしない場合、それは**バズ**を期待どおりに表示します。 –

+0

phpの設定でoutbutバッファリングが有効になっている必要があります。 – kaz

関連する問題