合理的ではないと思います。
なぜ実際にそのようなルールになったのでしょうか。
「通常のケースob_start
」では、前に呼び出す必要はないと思いますsession_start
-また、その逆も同様です。
ただし、のマニュアルページをsession_start
引用します。
session_start() は、trans-sid が有効になっている場合、URL 書き換え用の内部出力ハンドラーを登録します。ユーザーが ob_gzhandler などを ob_start() で使用する場合、出力ハンドラーの順序は適切な出力のために重要です。たとえば、ユーザーはセッション開始前に ob_gzhandler を登録する必要があります。
しかし、これはある種の特殊なケースです。ここで重要なのは、出力ハンドラーの順序が重要であるということです。あるハンドラーが他のハンドラーが行ったことを変更したい場合は、「正しい」順序で実行する必要があります。
一般に、そのようなハンドラーを使用しない場合(たとえば、出力の圧縮に関しては Apache とmod_deflate
素晴らしい仕事をします)、唯一重要なことは、呼び出す前にヘッダーを送信してはならないということですsession_start
(なぜなら、session_start
HTTP ヘッダーとして渡される Cookie を送信します)。
<?php ?>
また、ヘッダーは、データの一部を送信する必要があるとすぐに送信されます。つまり、タグの外側に空白が 1 つでも出力があるとすぐに送信されます。
注: Cookie ベースのセッションを使用している場合は、ブラウザーに何かを出力する前に session_start() を呼び出す必要があります。
ob_start
PHP がデータをバッファする必要があることを示します。
この関数は、出力バッファリングをオンにします。出力バッファリングがアクティブになっている間は、スクリプトから (ヘッダー以外の) 出力は送信されず、出力は内部バッファーに格納されます。
このように、実際に自分で「データを送信する」と言う前に、出力は送信されません。これは、ヘッダーがすぐに送信されないことを意味します。つまり、使用されていsession_start
なければ、出力があったとしても、後で呼び出すことができますob_start
。
これが物事をもう少し明確にすることを願っています...
デフォルトでoutput_buffering
はOff
、1 バイトのデータをクライアントに送り返すほど不幸だった場合、HTTP
ヘッダーは既に送信されています。これによりsession_start()
、Cookie ヘッダーがクライアントに返されることが効果的に防止されます。を呼び出すob_start()
と、バッファリングが有効になり、http ヘッダーの送信が遅れます。
session_start
特定の構成オプションが設定されている場合、HTTP ヘッダーを変更する必要がある場合があります。たとえば、 Set-Cookieヘッダー フィールドを設定/変更する必要があるsession.use_cookiesがあります。
HTTP ヘッダーを変更するには、最初の出力が送信される直前にHTTP ヘッダーが送信されるため、既にクライアントに送信されている出力がないことが必要です。
したがって、の呼び出しの前に出力がまったくないことを確認しますsession_start
。または、出力バッファリング コントロールを使用して出力をバッファリングし、既に出力がある場合でも HTTP ヘッダーを変更できるようにします。
session_start(); ヘッダーが送信される前に呼び出す必要があります。ob_start() はしばらくの間出力を抑制し、この規則を破ることができます。通常、上部にある ob_start() は、未知のものをデバッグしている場合の迅速な修正です。以下のすべてが期待どおりに機能します(書かれているだけではありません;-))。私は、後で session_start() よりも ob_start() を使用することを好みます。
session_start()
trans-sid
が有効な場合、URL 書き換え用の内部出力ハンドラを登録します。ユーザーがob_gzhandler
or like with を使用する場合、ob_start()
出力ハンドラーの順序は適切な出力のために重要です。
たとえば、ユーザーはob_gzhandler
セッション開始前に登録する必要があります。
しかし、これはある種の特殊なケースです。ここで問題なのは、出力ハンドラの順序が重要だということです。あるハンドラーが他のハンドラーが行ったことを変更する場合は、「正しい」順序で実行する必要があります。
一般に、そのようなハンドラーを使用しない場合 (たとえば、Apachemod_deflate
は出力の圧縮に関して優れた仕事をします)、唯一重要なことは、呼び出す前にヘッダーを送信してはならないということですsession_start
(なぜなら、session_start
HTTP ヘッダーとして渡される Cookie を送信します) 。
また、ヘッダーは、データの一部を送信する必要があるとすぐに送信されます。つまり、出力があるとすぐに、<?php ?>
タグの外側に空白が 1 つでもあります。
注: Cookie ベースのセッションを使用している場合はsession_start()
、ブラウザーに何かを出力する前に呼び出す必要があります。
ob_start
PHP がデータをバッファする必要があることを示します。
この関数は、出力バッファリングをオンにします。出力バッファリングがアクティブになっている間は、スクリプトから (ヘッダー以外の) 出力は送信されず、出力は内部バッファーに格納されます。
このようにして、実際に自分で「データを送信する」と言う前に、出力は送信されません。これは、ヘッダーがすぐに送信されないことを意味します。つまり、session_start が使用されていなければ、出力があったとしても後で呼び出すことができますob_start
。