仕事ではほとんどすべてを Java と perl で行っていますが、私は PHP とセッションを使用して機能を構築したいと考えていました。多くのサーバーに分散されているため、私たちのシステムで PHP セッションを実行しようとするのは悪い考えだと考える人もいました。具体的な問題は何ですか?
5 に答える
カスタム セッション保存ハンドラを使用することもできます。
http://www.php.net/manual/en/function.session-set-save-handler.php
試したことはありませんが、独自の保存/読み取り関数を定義できるため、拡張機能をインストールしなくてもデータベースや共有 nfs バックエンドを実装できます。
また、@Eran Galperin によって提案された Msession は、前に述べたものの代替として非常に興味深いようです。
あなたの特定の質問に対する答えは、問題は何であるかということですが、デフォルトでは、PHP はそのセッションをファイルシステム上のファイルに保存するという事実にあります。リクエストを処理する単一の Web サーバーの場合、セッション データは常に利用できるため、これは問題ではありません。しかし、負荷分散された 2 つの Web サーバーがリクエストを処理しているとしたらどうでしょうか?
最初の Web サーバーにリクエストが送信され、そのファイル システムにセッション ファイルが作成されることを想像してみてください。次に、次のリクエストが 2 番目の Web サーバーにヒットします。もちろん、2 番目の Web サーバーはセッション ファイルを認識しません。ユーザーにとっては、Web サイトにログインした後、突然ログアウトされる可能性があります。
これは PHP に固有の問題ではなく、非常に一般的な問題です。解決策は、セッション データをいくつかの共通領域に保存することです。これを行う最も一般的な方法は、すべての Web サーバーからアクセス可能なデータベース、または memcached などの共有メモリ キャッシュ サーバーにセッション データを保存することです。
複数のサーバー間でのセッションの永続化 (セッション クラスタリングとも呼ばれます) は、Web アプリケーションのスケーリングに関する一般的な問題であり、PHP に固有のものではありません。PHP は、 Zend Platform (商用アプリケーション サーバー) やMsession (拡張機能)など、それを処理するためのいくつかのソリューションを提供しています。
最も簡単なのはmemcachedまたはredisです。
これがredisでそれを行う方法です-私たちは現在それを使用しています: http ://redis4you.com/articles.php?id = 001&name = Redis + as + session + handler + in + PHP
非常に漠然とした質問ですが、問題は回答に記載されているよりも大きいと思います。もちろん、Cookie の読み込みと保存の方法をオーバーライドできますが、それにはコストもかかります。たとえば、次のシナリオ/質問を考慮する必要があります。
- Cookie を別のホストに置いている場合、Cookie の速度にどのような影響がありますか? それは明らかに、書き込み/読み取りの回数に依存します。
- これを行っているのは、速度を上げるためですか、それともフェイルオーバーを行うためですか? 答えは間違いなくさまざまな解決策につながります。
- フェールオーバーのためにこれを行っている場合、ネットワーク リンクがダウンしたために Web サーバーがセッション ストアにアクセスできない場合、どのように処理しますか? セッション ストアがダウンした場合はどうなりますか? ある種のマスター マスター レプリケーションを使用してこれを解決する必要があります。場合によっては、その分散セッション ストアを Web サーバーと同じマシンで実行して、さらに高い可用性を実現する必要があります (すべてのセッションがメモリに収まる場合)。マスター マスター レプリケーションについては、 Riakなどをご覧ください。
- 単に速度のためにこれを行っている場合は、apache、nginx、または (最速の) haproxy を使用して、クライアント IP アドレスに基づいて負荷分散を行うだけです。そうすれば、分散セッション ストアの設定に煩わされる必要がなくなります。確かに、PHP インスタンスの 1 つがダウンした場合、ユーザーは Cookie を失いますが、おそらくそれは問題ではありません。それはあなた次第です。