11

合理的ではないと思います。

なぜ実際にそのようなルールになったのでしょうか。

4

5 に答える 5

15

通常のケースob_start」では、前に呼び出す必要はないと思いますsession_start-また、その逆も同様です。

ただし、のマニュアルページをsession_start引用します。

session_start() は、trans-sid が有効になっている場合、URL 書き換え用の内部出力ハンドラーを登録します。ユーザーが ob_gzhandler などを ob_start() で使用する場合、出力ハンドラーの順序は適切な出力のために重要です。たとえば、ユーザーはセッション開始前に ob_gzhandler を登録する必要があります。

しかし、これはある種の特殊なケースです。ここで重要なのは、出力ハンドラーの順序が重要であるということです。あるハンドラーが他のハンドラーが行ったことを変更したい場合は、「正しい」順序で実行する必要があります。


一般に、そのようなハンドラーを使用しない場合(たとえば、出力の圧縮に関しては Apache とmod_deflate素晴らしい仕事をします)、唯一重要なことは、呼び出す前にヘッダーを送信してはならないということですsession_start (なぜなら、session_startHTTP ヘッダーとして渡される Cookie を送信します)

<?php ?>また、ヘッダーは、データの一部を送信する必要があるとすぐに送信されます。つまり、タグの外側に空白が 1 つでも出力があるとすぐに送信されます。

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

ob_startPHP がデータをバッファする必要があることを示します。

この関数は、出力バッファリングをオンにします。出力バッファリングがアクティブになっている間は、スクリプトから (ヘッダー以外の) 出力は送信されず、出力は内部バッファーに格納されます。

このように、実際に自分で「データを送信する」と言う前に、出力は送信されません。これは、ヘッダーがすぐに送信されないことを意味します。つまり、使用されていsession_startなければ、出力があったとしても、後で呼び出すことができますob_start


これが物事をもう少し明確にすることを願っています...

于 2009-09-20T13:21:42.660 に答える
6

デフォルトでoutput_bufferingOff、1 バイトのデータをクライアントに送り返すほど不幸だった場合、HTTPヘッダーは既に送信されています。これによりsession_start()、Cookie ヘッダーがクライアントに返されることが効果的に防止されます。を呼び出すob_start()と、バッファリングが有効になり、http ヘッダーの送信が遅れます。

于 2009-09-20T13:29:24.407 に答える
0

session_start特定の構成オプションが設定されている場合、HTTP ヘッダーを変更する必要がある場合があります。たとえば、 Set-Cookieヘッダー フィールドを設定/変更する必要があるsession.use_cookiesがあります。

HTTP ヘッダーを変更するには、最初の出力が送信される直前にHTTP ヘッダーが送信されるため、既にクライアントに送信されている出力がないことが必要です。

したがって、の呼び出しの前に出力がまったくないことを確認しますsession_start。または、出力バッファリング コントロールを使用して出力をバッファリングし、既に出力がある場合でも HTTP ヘッダーを変更できるようにします。

于 2009-09-20T13:52:56.623 に答える
0

session_start(); ヘッダーが送信される前に呼び出す必要があります。ob_start() はしばらくの間出力を抑制し、この規則を破ることができます。通常、上部にある ob_start() は、未知のものをデバッグしている場合の迅速な修正です。以下のすべてが期待どおりに機能します(書かれているだけではありません;-))。私は、後で session_start() よりも ob_start() を使用することを好みます。

于 2015-01-07T11:54:53.673 に答える
0

session_start()trans-sidが有効な場合、URL 書き換え用の内部出力ハンドラを登録します。ユーザーがob_gzhandleror like with を使用する場合、ob_start()出力ハンドラーの順序は適切な出力のために重要です。

たとえば、ユーザーはob_gzhandlerセッション開始前に登録する必要があります。

しかし、これはある種の特殊なケースです。ここで問題なのは、出力ハンドラの順序が重要だということです。あるハンドラーが他のハンドラーが行ったことを変更する場合は、「正しい」順序で実行する必要があります。

一般に、そのようなハンドラーを使用しない場合 (たとえば、Apachemod_deflateは出力の圧縮に関して優れた仕事をします)、唯一重要なことは、呼び出す前にヘッダーを送信してはならないということですsession_start(なぜなら、session_startHTTP ヘッダーとして渡される Cookie を送信します) 。

また、ヘッダーは、データの一部を送信する必要があるとすぐに送信されます。つまり、出力があるとすぐに、<?php ?>タグの外側に空白が 1 つでもあります。

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

ob_startPHP がデータをバッファする必要があることを示します。

この関数は、出力バッファリングをオンにします。出力バッファリングがアクティブになっている間は、スクリプトから (ヘッダー以外の) 出力は送信されず、出力は内部バッファーに格納されます。

このようにして、実際に自分で「データを送信する」と言う前に、出力は送信されません。これは、ヘッダーがすぐに送信されないことを意味します。つまり、session_start が使用されていなければ、出力があったとしても後で呼び出すことができますob_start

于 2014-03-29T06:22:33.217 に答える