2009年7月20日月曜日

PHP でセッションの利用 – session_start()

PHP でセッションを利用するには session_start() を使う。

しかし、次のコードを実行するとエラーが発生。

こんにちは
<?php
session_start();
?>

結果は、

こんにちは
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:XXXXXX\test.php:2) in C:XXXXX\test.php on line 3

これは 初めてのPHP5 (p164) によると、

HTML の前はヘッダを含む応答の一部です。ヘッダは画面には表示されませんが、Web クライアントからサーバへの命令や情報になります。…

Web サーバから Web クライアントへの応答ヘッダはすべて、応答の始めにあるべきです。… 一度、本文が送られると、たとえそれが 1 行であっても、それ以上ヘッダが送られることはありません。…

setcookie() や session_start() のような関数は応答にヘッダを追加します。追加されたヘッダが適切に送られるためには、出力の開始前に追加されなければなりません。…

ブランク行であっても、<?php ?> タグの外側には何もないことをチェックしましょう。

上記のヘッダとは[Studying HTTP] HTTP Header Fields による、

クライアントとサーバは、HTTP ヘッダを使ってデータやソフトウェア自身の情報をやりとりしていきます。 HTTP/0.9 では、データの取得のみを目的としていたので、HTTP ヘッダというものは存在しませんでした。しかし、WWW が活用され始め、そのリソースに関連する情報 (例えば、返されるリソースのサイズやその更新時刻等) や、クライアント側の情報 (例えば、ユーザエージェントの種類やそれを参照するリソースの URL 等) をやりとりしたいと思うようになり、実際のリソースとは別のメタ (外部) 情報を扱うものとして、HTTP ヘッダが開発されたのです。

PHP: session_start – Manual の注意をよく読むと、

注意: クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要があります。

呼出すタイミングには注意が必要。状態を考えてコーディングしないといけないのはやっぱ面倒だなぁ。。 (+_+)

 

参考