2009-07-20 8 views
1

PHPで独自のセッション管理を実装するにはどのようなオプションがありますか?PHPで独自のセッション管理を実装する

すべてのセッションタスクを実行するコンポーネントを実装するいい方法がありますか? リクエスト処理中にHTTPリクエストとレスポンスを受け取るクラスを作成するにはどうすればよいですか? 私は、ストレージハンドラを定義しているような "session_save_handler"オプションしか見つけられませんでした。私が必要とするのは、セッション管理全体を置き換えることです。 PHP設定を使用する別の方法はありますか、すべての要求を受け取り、セッション管理を呼び出す独自のコントローラを実装する必要がありますか? session_save_handler()機能を使用してあなたの助け

よろしくマイケル

答えて

3

いいえ、ご迷惑をおかけして申し訳ございません。組み込みの 'モジュール'を自分のものに切り替えるインターフェイスはありません。いくつかのフック(例:session_save_handler(), set_error_handler())がありますが、残念ながらそれです。

$ _SESSIONは「スーパーグローバル」なので、より大きなプロジェクトで作業している場合は、IMOを直接設定しないでください。それから、セッションの処理を担当するカスタムクラスを使用する方が良いでしょう。コードをデバッグしやすくするなどの作業を行います。

+0

なぜそれが直接ではありませんかについて詳しく説明できますか(クライアントが入力したデータが消されたと仮定して) – Sev

+1

グローバルな状態はプログラミング時に非常に危険です。それは、さまざまな場所からのコードの多くが、アプリケーションの「状態」を変えることができるときです。デバッグするのは面倒です。エントリポイントとしてクラスを使用している場合は、少なくともシステムに入るときにエラーをトラップすることができます。 Misko Heveryが私よりも優れた方法で説明しています: http://www.youtube.com/watch?v=-FRm3VPhseI – Stojg

0

ため

おかげでセッション情報が保存され、検索されたどのように処理することができます。

デフォルトでは、PHPはセッション情報をWebサーバーのどこかにある一時ファイルに保存します。 session_save_handler()関数を使用してコールバック関数を定義することができます。ここでは、この情報をデータベーステーブルに格納することができます。

session_save_handler()関数を使用して独自の定義済み関数を使用してセッションを処理する場合でも、スーパーグローバル変数$ _SESSIONSを使用して情報にアクセスします。

+0

session_save_handler()関数が十分ではないようです。自分のID生成、無効化などを実装する必要があります。したがって、セッションの記憶域を変更するだけでなく、セッション管理全体を変更する必要があります。 –

0

このページは、online manualからご覧ください。あなたの質問に関して多くの有益な情報を持っています。それが役に立てば幸い。

+0

私は既にこのページを見つけましたが、とにかくそれはセッションストレージ管理に関するものであり、セッション管理自体についてではありません--JRSoftyの投稿に対するコメントに記載されています! –

+0

'session_set_save_handler()'関数は、ネイティブセッションAPIが使用されるときに呼び出されるレジスタ関数です。既存のPHPライブラリを置き換えるのではなく、単にそれにフックを追加するだけです。 – Xenon

1

私はあなたが達成したいとは思っていません。 $ _SESSION変数から抽象化したいのは、記憶域を変更するよりも抽象的であるように思えます。

ZendまたはSolarフレームワークがSessionアクセスを処理する方法を見てください。

http://www.phpeveryday.com/articles/Zend-Framework-Session-Introduction-P571.html http://solarphp.org/manual:sessions

どのように私は1つのリクエストの処理中にHTTPリクエストとレスポンスを受信するクラスを構築することができますか?その後、(読み取り/書き込みセッションにアクセスすることができますメソッドを呼び出して、私はあなたが応答を受信することによって何を意味するのか、分かりませんが、フレームワークが選ばれたアクションにどのルートフロント/ページ・コントローラを持って

)およびRequest(読み取り)オブジェクトを生成し、Responseオブジェクトを生成します.Responseオブジェクトは、テンプレートを通してレンダリングされます。

自動テストでは、独自のリクエストオブジェクトとセッションオブジェクトを作成し、それらをページコントローラに渡すことができます。

+0

"ストレージを変更するよりも、$ _SESSION変数から抽象的に抽象化したいと思うようです。" - それは私が欲しいものではありません。もし私が$ _SESSIONを使用して行くことができるなら、PHPのオリジナルではなくSessionManagementをバックグラウンドで呼び出すのが最善の解決策です。 別の例として、session_start()があります。これはMY SessionManagementを初期化します。 PHPはインタフェースと設定の可能性を提供していますか? –

+0

私はそれを一度も使ったことがありませんが、session_set_save_handler()の最初のコールバック引数はsession_start()で呼び出されるコールバック引数です。だからそこにあなたのsession_id()世代を接続することができます。 ession_set_save_handler()でオブジェクトのメソッドを登録するには、ここを見てください。 http://www.mt-soft.com.ar/2007/12/21/using-a-mysql-database-to-store-session-data/ – GrGr

1

あなたはコメントの1つであなた自身を言った。クラス内で$ _SESSIONをラップするだけです。私はあなたがそれを置き換えることはできないと思うが、あなたはそれにあなた自身のインターフェースを構築することができる。

たとえば、最初に構築されたクラスを構築し、コンストラクタ内でsession_start()を呼び出します。

0

クッキーとデータベースを使用してセッションの実装を作成できます。クッキーはクライアントのマシンに設定します。その後、データベース上の検索を実行し、このような何か:

+--------+------+ 
| sessid | data | 
+--------+------+ 

sessidは、クッキー(おそらくいくつかのmd5の王やSHAハッシュ)への参照が含まれており、データはJSONまたはSerialized配列のようなものである場合には。

機能:

あなたはsession_にXXXX関数を再定義するために、Runkit APIの一部である機能runkit_function_redefine()を、使用することができます。
注:RunkitはPECLの一部です。つまり、PHPにはバンドルされていません。 install it yourselfにする必要があります。

セッション変数:

$_SESSION = &SessionClass->data; 

シンプルそのもの:ちょうどあなたのデータへの参照として$_SESSIONを作ります。

関連する問題