質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

EC-CUBE

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

Q&A

解決済

3回答

15059閲覧

[php]異なるプログラムでのセッションの共有を実現したい

toranomon

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

EC-CUBE

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

1グッド

3クリップ

投稿2016/04/05 02:23

初めて投稿します。よろしくお願いします。

PHP にて、異なるプログラムでのセッションの共有について、何か良い方法が無いか模索しています。

現在、ワードプレスという「ブログ」と、ZENCART という「ショッピング」のシステムの間で、同じセッション情報が共有できないか試しています。

ワードプレスには、welcart という「ショッピング」のプラグインがあるのですが、それだと望むことが出来ないので、ZENCART という「ショッピング」のシステムと何とか併合したいのです。

ワードプレスでセッションを有効にするには、「wp-config.php」に、以下のコードを追加するだけで行けました。
if (!session_id()) {
session_start();
}
これで、ワードプレス内では、セッション情報が保たれていることを確認済みです。

一方、これでショッピングのシステムを開くと、ショッピングのシステムではショッピングのシステム間でのみのセッションがはられる(セッションIDが新規に作られる)ため、ワードプレスでのセッション情報が参照できません。

試しに、ショッピングのシステムの同一フォルダ階層にて、セッション情報だけを見るプログラムを走らせたところ、そこではセッション情報が見れています。

すなわち、2つのセッションがはられてしまっている訳です。

このような場合、みなさまどうされているのか、どのような方法が良いのか、他のショッピンサイトとの併合の場合の対処でも良いので、シェアして頂けると幸いです。

・やりたいこと
ワードプレスにおいて、ゲストとカスタマーで違う情報を見せたい。
→これは、ワードプレスのセッションで実現
カスタマーには、ショッピングも出来るようにしたい。
× 事情により、プラグインではなく、他のショッピングシステムを使いたい
→ セッションが引き継げないので、ワードプレスでのログイン、ショッピングでのログインと2回、必要になってしまう。

・考えられる解決法
クッキーに保存する
それが危ないからセッションがある訳で、なるべく避けたい。でも、IDだけ引き継ぐのなら良いのかもしれない。その場合は、ショッピングの時に、再ログイン。

2つのセッションを並列して使う
やっちゃいけなそうなので、やってないが、それは思い込みで、これでも出来るのかもしれない。

現状、この辺りで行き詰まっています。
初めての投稿で、多々、粗があると思いますが、
よろしくお願いします。

ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

いささか混乱もあるようなので、いくつか整理しながら。

「セッション」というのは、一般的には「継続的に情報をやりとりする場所、あるいは一連のやりとり」という意味で、そういう意味では「セッションを張る」と表現することもあります(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 に自動ログインさせるにはどうすうか、というあたりは、双方のシステムの仕組み対する理解とある程度コーディングは必要になるでしょう。

また、セッションクッキーのドメインを変更しない場合でも、先に挙げたセッションハンドラにカスタマイズ処理を入れることで、一方でログインしたときに他方でログインしたことにする、というのも、可能だと思います。面倒くさそうですけどね。

投稿2016/04/05 03:31

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2016/04/05 05:28

サブドメインで分割されているだけで,同じドメイン部分がある場合にはsession_set_cookie_paramsでドメインを指定する方法が最も簡単だと思います. これが出来ない場合,セッションハンドラにカスタマイズ処理を入れるとありますが,同じリモートIPアドレスに対しては同じセッションIDを発行するように書く…ぐらいしか方法が無さそうに思えます.これはグローバルIPを共有しているマンションなどではセキュリティ的に問題があると思います. ところで,Googleなどは全く別の方法をとっているようです. https://teratail.com/questions/31529 他者の質問から沸いた疑問として私も質問させていただきましたので,よろしければこちらにも回答お願いしますw
toranomon

2016/04/05 06:16

unau さん、回答ありがとうございます! セッションについて、詳しい説明ありがとうございます。 理解が出来ました。大変、助かります。 まだまだ理解が足りませんが、「セッションハンドラ」の共通関数なるものが作れれば、便利そうです。 頂いたヒントをもとに、探って行きます。
toranomon

2016/04/05 06:23

CertaiN さん、回答ありがとうございます! 同一ドメインなので、「session_set_cookie_params」なるもので、試してみたいと思います。 また、「あるドメイン上でログインしただけで別のドメイン上でもログインしたことになる」という,シングルサインオン認証なるものもあるのですね。これだとドメインが違っても情報を共有できそうで、便利そうです。何かヒントでも知っている方がいましたら、こちらと共々、回答を頂けると幸いです。
unau

2016/04/05 09:57

シングルサインオン (SSO) について。 SSO はだいぶ昔 (たぶん 20 年かそこら) からある考え方で実現方法もさまざまですが、ここ数年は下火になってきていて、今後は一部基幹系サービスに細々と残る他は、ブラウザによる入力代行と OAuth2.0 (とその後継) によるサイト間連携に収斂していくんじゃないか、と、もはや業界を引退したおっさんは思うわけであります。たぶん、外れる予想ですが。で、SSO と聞くと、なんとなく 20世紀の話かと思ってしまうのですが、まだまだ使われる用語のようですね。 というのはさておき、SSO の実現方式は大きく分けて二つ、一つは代行入力方式、もう一つはサイト信頼方式です(方式の名前は今、適当につけました)。 代行入力方式は、サイト A に U さんがログインしたときに、サイト A に保存しておいた U さんの ID・パスワードを使ってサイト A から自動的にサイト B にログインし、発行されたセッション ID を B にユーザに戻してサイト B へログインできるようなタイプのものです。最近のブラウザはパスワードを自動入力してくれるし、そのデータ自体もクラウドで一元管理してくれますよね、で、その情報にアクセスするにはマスターパスワードが必要、みたいな。まあ、そんなイメージで。SSO 用のサーバがリバースプロキシとして間に入る構成もあるようなないような。まあ、そういう構成が取れるなら各サイトの作りは楽ですね、というか特に SSO 対策必要ないですから。 一方のサイト信頼方式は、サイト A にユーザ U がログインしてあったとして、(☆) U がサイト B にアクセスしたとき、サイト B からサイト A に「U ってやつからリクエストあったんだけど、こいつログインさせていい?」と問い合わせ、サイト A にログイン済みであれば「いいよ」と返事が返ってくるので、サイト B はサイト A を「信頼」して、U をログイン済みとしてアクセスさせる (☆) というものです。詳細は割愛しますが、(☆) から (☆) までを、リダイレクトを駆使してユーザにはサイト間連携を見せないようにするのが普通です(たぶん)。「サイト A がユーザ U に対して持った信頼」をバックエンドのサーバに保持し、それを「サイト A を信頼しているサイト B」が利用する、という方式もあります。
unau

2016/04/05 10:08

CertaiN さん、私が想定した、SSO 実現のためのカスタムセッションハンドラは、単なるセッション ID 一つに紐付いたセッション情報の保持ではありません。wordpress でログイン成功したら、そこに ZENCART へのリンクを張るわけですが、そこに CSRF 対策よろしく生成したワンタイムトークンも付加するわけです。ZENCART 側に移ったときにトークンも一緒に飛ばされるようにするってことです。で、ZENCART 側では飛んできたトークンを元にセッション情報をサーチし、一致するトークンを保持しているセッション情報があれば、それを利用する、と。ZENCART 側は ZENCART 側で cookie ベースでセッション管理すると便利なので、そのタイミングで cookie 用のセッション ID (こうなってくると ID と呼んでいいのか不明ですが) を払い出すと便利でしょうね。 と、特に深く考えるでもなく思いついただけなので、穴はあるかもしれません。
unau

2016/04/05 10:09

CertaiN さんが別に挙げられた質問の方は、他の方がよい回答をされているようですので、私の出る幕はなさそうです。
mpyw

2016/04/05 11:08

詳しいコメントありがとうございました!
guest

0

単純にログインしているかどうかだけであれば、ZENCART側に現在ログインしているかの情報をjsonで返すページを作成し、jsでそれを読んで表示すれば解決すると思います。

また、ZENCARTとWordPressの統合ならプラグインがあるようです。こちらであればもっと詳細にデータのやり取りができるようです。

【zen4wp | Zen Cart & WordPress Integration】
http://zencart-wordpress-integration.com/tag/zen4wp/
【Zen Cart for WordPress (zen4wp) — WordPress Plugins】
https://ja.wordpress.org/plugins/zen4wp/
【WordPress for Zen Cart® Basic (wp4zen) : Over the Hill Web Consulting】
http://overthehillweb.com/shop/free-modules-plugins-addons/zen-cart-free-add-ons/wordpress-for-zen-cartr-basic-wp4zen#.VwM9uBVUtjF

投稿2016/04/05 04:31

kei344

総合スコア69583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toranomon

2016/04/05 06:12

回答ありがとうございます! 早速、プラグインを導入して、試してみます!
guest

0

サーバ側に、プログラムが追加できるなら、流行?のNoSQL系など使う手もあります。

redis

を入れて、PHPからアクセスできるよう、

php-pecl-redis

を導入します。
そうすると、オンメモリでいろいろ共有できちゃいます。
セッションなどとは比べものにならない便利な物です。サーバを超えても共有できます。スケールアップにも対応OKみたいな。
しかし、サーバ側に導入できるかどうか?が問題ですね。

redis php

で検索すると、いろいろ出てきます。

投稿2016/04/05 23:47

ItoTomonori

総合スコア1283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問