🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

memcached

memcached は、汎用の分散型メモリキャッシュサーバです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4294閲覧

Laravelでmemcachedに保存したセッション情報が他サーバーから取得できない

nekoneko21213

総合スコア12

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

memcached

memcached は、汎用の分散型メモリキャッシュサーバです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2021/07/06 01:37

前提・実現したいこと

現在Laravelを利用してサービスを開発しており、キャッシュにAWS Elasticacheのmemcachedを利用しています。
Laravelでmemcachedに保存したセッションデータをもう一台別のサーバーからmemcachedへ接続してセッション情報を取得しようとしているのですが、データが空になってしまって取得することができません。
複数台のサーバーでセッション情報を共有できる状態にしたいです。

現在のサーバー構成

AWS EC2 2台 (ubuntu) サーバー1: Laravelで動かしているアプリケーション サーバー2: PHPのみで動かしているアプリケーション AWS Elasticache memcached 1台 上記EC2 1,2からこちらにアクセスするように設定しています

該当のソースコード

PHP

1<サーバー1:Laravel側> 2確認用でsessiontestというキーで123を保存 3session()->put('sessiontest', '123'); 4 5memcachedに保存された値を確認 6$ /usr/share/memcached/scripts/memcached-tool xxx.xxx.cfg.apne1.cache.amazonaws.com:11211 dump 7-------------------------------------------------------- 8add _cache:M5otij3Oa7WmFONqcBKEq18pUc7W5EfzyvJn0p8o 0 1625540590 228 9a:4:{s:6:"_token";s:40:"OTi6n7pfix2wvc6LMo20KDmkPIECElOJdXEKPMik";s:9:"_previous";a:1:{s:3:"url";s:41:"https://xxxxxx";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}s:11:"sessiontest";s:3:"123";} 10-------------------------------------------------------- 11"sessiontest":"123"が保存できていることを確認 12 13<サーバー2: PHPのみ> 14session_start(); 15$sessiontest = $_SESSION['sessiontest']; //ここでNULLになる

発生している問題・エラーメッセージ

memcachedには保存されているのにセッション情報がNULLになってしまい取得することができない。

試したこと

Laravel側でLaravelの機能を利用しないPHPの書き方でセッション情報を保存してみましたが同じでした。

PHP

1<サーバー1:Laravel側> 2確認用でsessiontest2というキーでtestvalを保存 3session_start(); 4$_SESSION['sessiontest2'] = 'testval'; 5 6memcachedに保存された値を確認 7$ /usr/share/memcached/scripts/memcached-tool xxx.xxx.cfg.apne1.cache.amazonaws.com:11211 dump 8---------------------------------------------------------------- 9add memc.sess.key.k1kdt5iqeoim0vcb3sfb1ekrr4 0 1625536072 27 10sessiontest2|s:7:"testval"; 11---------------------------------------------------------------- 12保存できていることを確認 13 14<サーバー2: PHPのみ> 15session_start(); 16$sessiontest = $_SESSION['sessiontest2']; //ここで同じくNULLになる

補足情報(FW/ツールのバージョンなど)

Laravel Framework 6.20.26 PHP 7.4.3 (2台とも) Ubuntu VERSION="20.04.2 LTS (Focal Fossa)" (2台とも) memcached cache.t2.micro
サーバー1:Laravel側 memcachedの設定 .envファイル ------------------------------------------------------- CACHE_DRIVER=memcached MEMCACHED_HOST=xxx.xxx.cfg.apne1.cache.amazonaws.com MEMCACHED_PORT=11211 QUEUE_CONNECTION=sync SESSION_DRIVER=memcached SESSION_LIFETIME=120 -------------------------------------------------------
サーバー2:PHP側 memcachedの設定 [Session] ; Handler used to store/retrieve data. ; http://php.net/session.save-handler session.save_handler = memcached session.save_path = "xxx.xxx.cfg.apne1.cache.amazonaws.com"

因みにセッション情報でなくkey,valueでmemcacheに保存する方法では保存取得が問題なくできています。
各サーバーでmemcachedにアクセスはできているので、何かセッション情報の保存方法もしくは取得方法が間違っているのでしょうか?
ご教授いただければ幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Laravel側のSessionはLaravel独自管理のSessionですので、サーバー2でもmemcacheを通してその情報を取得したい場合には、こちらもLaravel経由で取得する必要があります。サーバー1で$_SESSIONに保存してもそれはサーバー1でしか使えません。

参考)
https://qiita.com/fagai/items/e6abe231a12e041903b5


と思ったら、他の情報はmemcached経由で読めてるのですね。原因がちょっと違うかもしれません、ごめんなさい。.envのAPP_KEYを合わせる必要があるとかかな?


さらに追記)

LaravelのSessionでAPP_KEYを使ってるのは間違いなさそうなので、書き込みはできても読み込むにはLaravel経由じゃないと厳しいのかな? もしくはSESSION_DOMAINが影響している可能性もありそうです。Cookieの内容とも突き合わせて確認する必要がありそうですね。LaravelのSessionの実装を確認すれば解決できそうではありますが。

ということで、曖昧な回答になってしまい申し訳ありませんでした。。。

投稿2021/07/06 01:59

編集2021/07/06 02:16
AbeTakashi

総合スコア4848

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

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

nekoneko21213

2021/10/11 07:36

@AbeTakashi ログインできなくなってしまってが回答が遅くなってしまってしまいました、、すみません。 諸々アドバイスありがとうございます。 やはりLaravel経由じゃないとできなかったので、今回は別の方法で対応することにしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問