<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/session.examples.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'session.examples.basic.php',
    1 => '基本的な使用法',
    2 => '基本的な使用法',
  ),
  'up' => 
  array (
    0 => 'session.examples.php',
    1 => '例',
  ),
  'prev' => 
  array (
    0 => 'session.examples.php',
    1 => '例',
  ),
  'next' => 
  array (
    0 => 'session.idpassing.php',
    1 => 'セッションIDの受渡し',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/session/examples.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="session.examples.basic" class="section">
  <h2 class="title">基本的な使用法</h2>
   <p class="para">
    セッションは、シンプルな方法で個々のユーザーのデータを格納する仕組みで、
    個々のユーザーに対して一意なセッション ID を用意します。
    これを用いて、複数ページにまたがるリクエストの間で状態の情報を永続させることができます。
    セッション ID をブラウザに送信するときには、通常はセッションクッキーを利用します。
    また、その ID を使って既存のセッションデータを取得します。
    その ID やセッションクッキーが存在しなければ PHP に対して新たなセッションを作るよう伝え、
    新たなセッション ID を生成します。
   </p>
   <p class="para">
    セッションの処理の流れは単純です。セッションを開始すると、
    PHP はまず、(通常はセッションクッキーから受け取る) ID を使って既存のセッションを取得しようとします。
    ID を受け取らなかった場合は新しいセッションを作成します。
    セッションを開始すると、PHP はスーパーグローバル <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>
    にすべてのセッションデータを格納します。PHP スクリプトの処理が終了するときには、
    スーパーグローバル <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> の中身を自動的に受け取ってシリアライズし、
    ストレージに送信します。この一連の操作にはセッション保存ハンドラを使います。
   </p>
   <p class="para">
    デフォルトでは、PHP が使う保存ハンドラは <code class="parameter">files</code> です。これは
    <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a> で設定します。
    このハンドラは、サーバー上の
    <a href="session.configuration.php#ini.session.save-path" class="link">session.save_path</a> で指定した場所にセッションデータを保存します。
   </p>
   <p class="para">
    セッションを手動で開始するには <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> 関数を使います。
    <a href="session.configuration.php#ini.session.auto-start" class="link">session.auto_start</a> に
    <code class="parameter">1</code> を設定している場合は、
    リクエストの開始時に自動的にセッションを開始します。
   </p>
   <p class="para">
    通常は、PHP がスクリプトの処理を終了するときに、セッションは自動的に終了します。
    手動でセッションを終了させるには <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> 関数を使います。
   </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>例1 
     <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>で変数を登録
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">();<br />if (!isset(</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">])) {<br />  </span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">] = </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />} else {<br />  </span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">]++;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="example" id="example-2">
    <p><strong>例2 
     変数を <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> から削除する
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">();<br />unset(</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   <div class="caution"><strong class="caution">警告</strong>
    <p class="para">
     <code class="literal">unset($_SESSION)</code>によって
     全ての<var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>を初期化してはいけません。
     <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>スーパーグローバル変数を用いた
     セッション変数の登録ができなくなってしまうからです。
    </p>
   </div>
  </p>
  <div class="warning"><strong class="warning">警告</strong>
   <p class="para">
    セッション変数において参照を使用することはできません。
    他の変数への参照を復元する方法がないからです。
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    ファイルベースのセッション (PHP のデフォルト) は、
    <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> でオープンしたり
    <a href="session.configuration.php#ini.session.auto-start" class="link">session.auto_start</a> で暗黙のうちに開始したりしたセッションのセッションファイルをロックします。
    いったんロックがかかったら、そのスクリプトが終了するなり
    <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> を呼んでセッションを閉じるなりしない限り、
    他のスクリプトからはそのセッションファイルにアクセスできません。
   </p>
   <p class="para">
    これは、たとえば AJAX を使いまくっていて同時に複数のリクエストが発生したりするウェブサイトで問題になります。
    この問題への対処方法として一番お手軽なのは、セッションに対して必要な変更が終わったらすぐに
    <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> を呼ぶことです。スクリプトの最初のほうで呼ぶほうが好ましいでしょう。
    あるいは、ファイルではなく別のバックエンド (同時アクセスに対応しているもの) を使うという手もあります。
   </p>
  </p></blockquote>
 </div><?php manual_footer($setup); ?>