.. index:: single: Session; Database Storage PdoSessionStorage を使用してデータベースにセッションを格納する方法 ================================================================== Symfony2 のデフォルトのセッションストレージは、ファイルにセッションの値を記録することでした。中規模から大規模なウェブサイトでは、セッションの値をファイルに格納するのではなく、データベースに格納をします。それは、データベースの方が簡単に扱うことができ、複数のウェブサーバの構成にスケールアウトすることができるからです。 Symfony2 はセッションストレージにデータベースを使用するクラスをビルトインしています。クラス名は、 :class:`Symfony\\Component\\HttpFoundation\\SessionStorage\\PdoSessionStorage` です。このクラスを使用するには、 ``config.yml`` (もしくは選択したコンフィギュレーションのフォーマット)のパラメータを数個変更するだけです。 .. configuration-block:: .. code-block:: yaml # app/config/config.yml framework: session: # ... storage_id: session.storage.pdo parameters: pdo.db_options: db_table: session db_id_col: session_id db_data_col: session_value db_time_col: session_time services: pdo: class: PDO arguments: dsn: "mysql:dbname=mydatabase" user: myuser password: mypassword session.storage.pdo: class: Symfony\Component\HttpFoundation\SessionStorage\PdoSessionStorage arguments: [@pdo, %session.storage.options%, %pdo.db_options%] .. code-block:: xml session session_id session_value session_time mysql:dbname=mydatabase myuser mypassword %session.storage.options% %pdo.db_options% .. code-block:: php // app/config/config.yml use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; $container->loadFromExtension('framework', array( // ... 'session' => array( // ... 'storage_id' => 'session.storage.pdo', ), )); $container->setParameter('pdo.db_options', array( 'db_table' => 'session', 'db_id_col' => 'session_id', 'db_data_col' => 'session_value', 'db_time_col' => 'session_time' )); $pdoDefinition = new Definition('PDO', array( 'mysql:dbname=mydatabase', 'myuser', 'mypassword', )); $container->setDefinition('pdo', $pdoDefinition); $storageDefinition = new Definition('Symfony\Component\HttpFoundation\SessionStorage\PdoSessionStorage', array( new Reference('pdo'), '%session.storage.options%', '%pdo.db_options%', )); $container->setDefinition('session.storage.pdo', $storageDefinition); * ``db_table``: データベースのセッションテーブル名 * ``db_id_col``: セッションテーブルの id カラムの名前 (VARCHAR(255) または、より大きくしてください) * ``db_data_col``: セッションテーブルの value カラムの名前 (TEXT または CLOG) * ``db_time_col``: セッションテーブルの time カラムの名前 (INTEGER) データベース接続情報を共有する ------------------------------ 今回指定したコンフィギュレーションでは、データベース接続の設定に、セッションストレージの接続のみ定義しています。セッションデータのための独立したデータベースを使用するならば、これで問題がありません。 しかし、他のプロジェクトデータと同じデータベースでセッションデータを格納には、 parameter.ini に定義されたデータベースに関連するパラメータを参照して接続設定を使用することができます。 .. configuration-block:: .. code-block:: yaml pdo: class: PDO arguments: - "mysql:dbname=%database_name%" - %database_user% - %database_password% .. code-block:: xml mysql:dbname=%database_name% %database_user% %database_password% .. code-block:: xml $pdoDefinition = new Definition('PDO', array( 'mysql:dbname=%database_name%', '%database_user%', '%database_password%', )); SQL 構文の例 ------------ MySQL ~~~~~ 必要なデータベースのテーブルを作成するSQL 構文は以下のようになります(MySQL)。 .. code-block:: sql CREATE TABLE `session` ( `session_id` varchar(255) NOT NULL, `session_value` text NOT NULL, `session_time` int(11) NOT NULL, PRIMARY KEY (`session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; PostgreSQL ~~~~~~~~~~ PostgreSQL では、構文は以下のようになります。 .. code-block:: sql CREATE TABLE session ( session_id character varying(255) NOT NULL, session_value text NOT NULL, session_time integer NOT NULL, CONSTRAINT session_pkey PRIMARY KEY (session_id) ); .. 2011/12/27 ganchiku f46507a719ea01269df44478c2afd8d229daa008