- ベストアンサー
session_start()の使用に関する疑問
- session_start()が動作するタイミングとセッションの注意点について質問があります。
- PHPでは、session_start()の前には文字を出力しないはずですが、実際には出力されてしまうことがあります。
- また、CLIで動かした場合にはセッションに影響しないはずですが、警告が出てしまうことがあります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
あとは、session.auto_startの設定ぐらいしか思いつきませんが。
その他の回答 (2)
- mpro-gram
- ベストアンサー率74% (170/228)
出力バッファリングを行えば、session_start();や cookie発行などheader設定はいつでも行えるようになる機能は元から備わっています。 設定が変わったというなら、たぶん、php.ini の多バイト文字関連の以下の設定でしょう。 output_handler = mb_output_handler defaultは、ブランクなので、ブランクのままでは、phpソースの文字コードと異なる文字コードで出力するためのmb_http_output() が動作しません。 output_handlerは、バッファーに出力情報をため込んで、最後に、mb_output_handlerなどの関数をとおして変換をかけ、それからまずheader情報送信して、次にページ内容送信を行います。よって、出力バッファリングが常に行われることになります。 CLIのときは、読み込むphp.iniが異なって、上記バッファリングは無効なのでしょう。 一応、phpinfo() での設定を見比べてみるのが良いと思います。
補足
ありがとうございます。 CLIでphpinfo()を実行してみましたが、 output_handlerは両方no valueでした。 原因は、別のようです。
- JaneDue
- ベストアンサー率75% (263/350)
session_start()後に formが来ているので 「たまたま」trans_sid が有効に働いているだけでしょう。試しにformを出力後に session_start()してみて下さい。Cookieも発行できないので動作しないかと。 あるいは use_only_cookiesがOnの場合どうなるか、考えるまでもなく・・・。 seseion_start前に「出力してはいけない」というよりも、たぶん設定次第でどうなるか分からない、動作は保証されない、ということでは?
補足
formの後にsession_startしても、問題なく動きました。 CLIで動かないのは同様です。 ちなみにその辺の設定は、次のとおりです。 session.use_cookies On On session.use_only_cookies On On session.use_trans_sid 0 0 流したプログラムは、次のとおりです。 ---- ここから ---- aaaaaaaaaa <form action="sesTest.php"> <input type="submit" value="Push Me" /> </form> <?php session_start(); echo $_SESSION['time']; $_SESSION['time'] = time(); ?>
補足
これも、両方Offで同じです。 まあ、うまく動いて問題は無いんですが・・・ どこにも、保証が無いので、気持ち悪いです。