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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

3995閲覧

PHPのデフォルトのセッションを使わずにセッション機能を実現するエンタープライズシステムで利用する際に最も実用的だった方法を教えてください。

thisprogrammer

総合スコア27

PHP

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2019/02/15 04:16

編集2019/02/15 04:20

via https://www.quora.com/Why-does-WordPress-not-use-PHP-session-at-all
によると

「PHPセッションはデフォルトでファイルに保存され、それらのファイルはflock()システムコールを使用してPHPプロセスによってロックされ、スクリプトが完了するかsession_write_close()によってセッションが手動で閉じられるまでロックされたままです。つまり、ロックを保持しているプロセスによってセッションファイルがロック解除されるまで、他の要求はsession_start()でハングします。」

だそうです。

よって、セッション機能を実現する他の方法としていろいろと候補がありますが、エンタープライズシステムとして利用するには何をもって実現するのがよいのでしょうか?
別にワードプレスに限ったことではない普通のPHPアプリケーション、Webフレームワークを使ったアプリケーションにも通用するデフォルトのセッションを使わない方法を探しています。

私が探した候補としては各種DBをセッション保存領域とすることです。
https://qiita.com/SuguruOoki/items/6ca36ad1d366df6c98af

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

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

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

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

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

m.ts10806

2019/02/15 04:18

何が「よって」なのか分かりませんが、「エレガントな方法」という質問者さんの中でしか基準がないような内容だと回答の方向性が曖昧となり、何もアドバイスがつかない自体もありえます。 「問題・課題がない」という状態ですね。そこを明確にしてください。
thisprogrammer

2019/02/15 04:21

コメントありがとうございます。回答者さんの思うエレガントな方法を知りたかったのですが、私が思う方法を明示したほうが回答しやすいということに気が付きましたので修正いたします。
退会済みユーザー

退会済みユーザー

2019/02/15 05:41

セッションID毎に別ファイルだったと思いますが、同じでしたっけ?
ockeghem

2019/02/15 12:31

セッションID毎に別ファイルです
退会済みユーザー

退会済みユーザー

2019/02/15 12:41

ですよね。・・・DDOS中~後はどんな実装でも不安定にはなるし
guest

回答3

0

ベストアンサー

こういう時は本家のマニュアルを参照したほうが良いと思います。

注意:
ファイルベースのセッション (PHP のデフォルト) は、 session_start() でオープンしたり session.auto_start で暗黙のうちに開始したりしたセッションのセッションファイルをロックします。 いったんロックがかかったら、そのスクリプトが終了するなり session_write_close() を呼んでセッションを閉じるなりしない限り、 他のスクリプトからはそのセッションファイルにアクセスできません。

これは、たとえば AJAX を使いまくっていて同時に複数のリクエストが発生したりするウェブサイトで問題になります。 この問題への対処方法として一番お手軽なのは、セッションに対して必要な変更が終わったらすぐに session_write_close() を呼ぶことです。スクリプトの最初のほうで呼ぶほうが好ましいでしょう。 あるいは、ファイルではなく別のバックエンド (同時アクセスに対応しているもの) を使うという手もあります。

http://php.net/manual/ja/session.examples.basic.php より引用

すなわち、ファイルのロックが発生するのは、同じセッションIDについて同時にアクセスした場合です。そのようなケースは古典的なウェブアプリケーションではあまりないのですが、上記にあるように、AJAXにより複数のAPIが同一セッションでアクセスを同時に行う場合にはありえます。そのような場合には、セッションを使い終わったら直ちにsession_write_close()するか、場合によってはsession_abort()してもよいと思います。そうすれば、ロック待ちの問題はあまり顕在化しないと思います。

独自のセッション管理システムを作成することは、脆弱性がとても入りやすいので、まったくお勧めしません。私が見た範囲でも、以下の脆弱性が存在したケースがあります。

  • ディレクトリトラバーサル
  • SQLインジェクション
  • 安全でないデシリアライゼーション

ディレクトリトラバーサルの例は、この記事や、この記事をご覧ください。

安全でないデシリアライゼーションは、かつてJoomla!に存在した問題で、PHPの脆弱性との合わ技ではありますが、重大な脆弱性となりました。詳しくはこの記事を御覧ください。

ということで、フレームワークの標準のセッション管理システムをお使いになることをお勧めします。

投稿2019/02/15 12:27

ockeghem

総合スコア11701

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

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

0

よって、セッション機能を実現する他の方法としてエレガントな方法として何がよいのでしょうか?

真面目にロックしないセッションを作ろうとすると、依存関係やタイミングの問題などで余計に煩雑になります(セッション機構のみならず、その上で動かすコードにも響いてきます)。

よほど理由がない限り、重複するアクセスはロックするようにセッションを作るほうが適切です。

StackOverflow: Is there any way to disable PHP session locking?

投稿2019/02/15 04:22

maisumakun

総合スコア145123

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

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

thisprogrammer

2019/02/15 04:23

なるほど。デバッグ効率を上げるためにPHPのデフォルトの実装はそのようになっているのですね。スタックオーバーフローの記事ありがとうございます。
maisumakun

2019/02/15 04:24

なお、session_set_save_handlerを使うことで、$_SESSIONを使いつつ中身だけ別物に差し替えることができますので、実装を入れ替えるためには、それがいちばん「エレガント」ではないかと思います(セッションを使う側のコードに手を入れる必要がほぼありません)。 http://php.net/manual/ja/function.session-set-save-handler.php
thisprogrammer

2019/02/15 04:26

情報ありがとうございます。今後、実装するときその情報を使います。助かります。
guest

0

Webフレームワークを使ったアプリケーションにも通用する

それなら自力で仕組みを作らず既存のWebフレームワークを利用します。
何のためのフレームワークかって、アプリケーションを作ることだけに集中するためのものなので。
エンタープライズシステムがどこまでの規模を想定されているか分かりませんが、
この質問内容だけだと「デフォルトのセッションにどこが不満があるのか、不十分なのか」が分かりませんでしたし、
まあそれならフレームワークで対応するのが最も効率的で確実だと思いました。
(回答と言うより感想ですが、これも質問というより本来非推奨のアンケートにも近いので)

投稿2019/02/15 04:27

m.ts10806

総合スコア80765

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

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

thisprogrammer

2019/02/15 04:51

なるほど。とにかくフレームワークのデフォルトのものが良く考えられているから使っておこうということですね。情報ありがとうございました。
m.ts10806

2019/02/15 05:01

何に重きを置くかにもよります。 もちろんセキュリティにも明るく、PHPやサーバーなどに熟知していて運用・管理も完璧と言うのでしたら自前で準備するのもありとは思います。
m.ts10806

2019/02/15 05:17 編集

「でもそれって既にあるやん」というのが感想部分です。 既存のフレームワークでもわりかし新しいものは、それまでのフレームワークの使いにくい部分だったり 不満がある部分を埋めて作られているものもあるでしょうし。 動機をもう少し具体的にかためないと、もたないと思いますよ。 つまり、デフォルトのセッションの仕組みを何かの記事ではなく実際のPHPのソース(PHPコードと言う意味ではなくPHP本体のことです)から解析し深く理解すること、既存のフレームワーク、CMSの仕組みを熟知した上で進める必要がある、という意味です。
thisprogrammer

2019/02/15 05:23

なるほど。自前で進める場合、熟知が必要ですね。セッションの管理方法でデフォルト以外でデファクトスタンダードになっている方法があれば知りたかった次第です。情報どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問