質問: 初めて投稿します。よろしくお願いします。 PHP にて、異なるプログラムでのセッションの共有について、何か良い方法が無いか模索しています。 現在、ワードプレスという「ブログ」と、ZENCART という「ショッピング」のシステムの間で、同じセッション情報が共有できないか試しています。 ワードプレスには、welcart という「ショッピング」のプラグインがあるのですが、それだと望むことが出来ないので、ZENCART という「ショッピング」のシステムと何とか併合したいのです。 ワードプレスでセッションを有効にするには、「wp-config.php」に、以下のコードを追加するだけで行けました。 if (!session_id()) { session_start(); } これで、ワードプレス内では、セッション情報が保たれていることを確認済みです。 一方、これでショッピングのシステムを開くと、ショッピングのシステムではショッピングのシステム間でのみのセッションがはられる(セッションIDが新規に作られる)ため、ワードプレスでのセッション情報が参照できません。 試しに、ショッピングのシステムの同一フォルダ階層にて、セッション情報だけを見るプログラムを走らせたところ、そこではセッション情報が見れています。 すなわち、2つのセッションがはられてしまっている訳です。 このような場合、みなさまどうされているのか、どのような方法が良いのか、他のショッピンサイトとの併合の場合の対処でも良いので、シェアして頂けると幸いです。 ・やりたいこと ワードプレスにおいて、ゲストとカスタマーで違う情報を見せたい。 →これは、ワードプレスのセッションで実現 カスタマーには、ショッピングも出来るようにしたい。 × 事情により、プラグインではなく、他のショッピングシステムを使いたい → セッションが引き継げないので、ワードプレスでのログイン、ショッピングでのログインと2回、必要になってしまう。 ・考えられる解決法 クッキーに保存する それが危ないからセッションがある訳で、なるべく避けたい。でも、IDだけ引き継ぐのなら良いのかもしれない。その場合は、ショッピングの時に、再ログイン。 2つのセッションを並列して使う やっちゃいけなそうなので、やってないが、それは思い込みで、これでも出来るのかもしれない。 現状、この辺りで行き詰まっています。 初めての投稿で、多々、粗があると思いますが、 よろしくお願いします。
回答: いささか混乱もあるようなので、いくつか整理しながら。 「セッション」というのは、一般的には「継続的に情報をやりとりする場所、あるいは一連のやりとり」という意味で、そういう意味では「セッションを張る」と表現することもあります(TCP セッションとか SSH セッションとか) が、ここでの文脈上の「セッション」すなわち HTTP におけるセッションは、普通「セッションを張る」とは言いません。というのも、HTTP 自体はステートレスで(要は一回一回、全部別の通信)あり、プロトコル上に「セッション」の概念がないからです。 そのステートレスな HTTP を使って、でも「継続した一連のやりとり」を実現するのに HTTP セッションと称されるものが利用されるわけですが、一般的な実現方法が Cookie と「サーバ側のストレージ」の組合せのものです。 PHP の場合、デフォルトでファイルシステム上にセッション情報を保存する仕組みが備わっているわけですが、これを独自の実装(セッションハンドラ)に切り替えることも可能です。 Cookie の方も、ご案内のとおり、送信するドメインを自分で決めることができます。たとえば、wordpress を `http://wp.example.com/`、ZENCART を `http://zc.example.com/` に配置している場合、通常はセッション ID を含む cookie はそれぞれのドメインごとに別々に送られるわけですが、`session_set_cookie_params` でドメインを `.example.com` に設定することにより、wordpress にも ZENCART にも同一のセッション ID が渡されることになります。 もちろん、同一のセッションが扱えるようになったからといって、その整合性をどうとるか、wordpress でログインしていた場合に ZENCART に自動ログインさせるにはどうすうか、というあたりは、双方のシステムの仕組み対する理解とある程度コーディングは必要になるでしょう。 また、セッションクッキーのドメインを変更しない場合でも、先に挙げたセッションハンドラにカスタマイズ処理を入れることで、一方でログインしたときに他方でログインしたことにする、というのも、可能だと思います。面倒くさそうですけどね。