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

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

ただいまの
回答率

87.59%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,054

score 27

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/02/15 14:41

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

    キャンセル

  • ockeghem

    2019/02/15 21:31

    セッションID毎に別ファイルです

    キャンセル

  • asahina1979

    2019/02/15 21:41

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

    キャンセル

回答 3

checkベストアンサー

+7

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

注意:
ファイルベースのセッション (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の脆弱性との合わ技ではありますが、重大な脆弱性となりました。詳しくはこの記事を御覧ください。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/15 13:23

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

    キャンセル

  • 2019/02/15 13:24

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

    http://php.net/manual/ja/function.session-set-save-handler.php

    キャンセル

  • 2019/02/15 13:26

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

    キャンセル

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/15 13:51

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

    キャンセル

  • 2019/02/15 14:01

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

    キャンセル

  • 2019/02/15 14:05 編集

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

    キャンセル

  • 2019/02/15 14:23

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

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