7

リクエスト間の特定の状態情報に依存する API があります。コードの簡単な最初のバージョンとして、より高度なもの (APC、memcache、DB) の代わりに、単純に PHP セッションを使用して状態情報を保存しています。Web ブラウザーでの最初のテストでは、すべてが完全に機能しました。ただし、クライアントが Curl や wget などのブラウザ以外の方法で接続しようとすると、状態情報が保持されていないようです。

ブラウザがページをリクエストしている場合にのみ、PHP セッションが作成されますか? session_start() を使用してセッションを明示的に開始し、session_name() を使用して事前に名前を付けています。

追記. 私が抱えていた主な問題の 1 つは、session_id($id); を介してセッション ID を設定するのではなく、セッションに名前を付けていたことであることがわかりました。session_name() を使用する意図は、以前に作成されたものと同じセッションを取得することでした。これを行う正しい方法は、session_name ではなく session_id を設定することです。

以下に示すように、セッション情報はサーバー上に永続化されるようです (THANK YOU)。ただし、これを維持するには、セッション ID、または私の場合のように、ユーザーを一意に識別する他の ID を渡す必要があります。この ID を session_id として使用すると、セッションが期待どおりに機能します。

4

3 に答える 3

21

セッション クッキー

HTTP はステートレスであるため、セッションはサーバー上で追跡されますが、クライアントはリクエストごとに自分自身を識別する必要があることに注意してください。session_start() を宣言すると、ブラウザは通常、Cookie (「PHP セッション ID」) を設定し、各リクエストで Cookie の値を送信して自身を識別します。セッション値を持つリクエストを使用してスクリプトが呼び出されると、session_start() 関数はセッションを検索しようとします。これを証明するために、Cookie を消去するとセッションが終了することに注意してください。Cookie が「セッション」Cookie (一時的なもの) である場合、ブラウザーを終了するとすぐに多くのセッションが終了します。セッションに名前を付けていると言いました..ブラウザのCookieを見て、同じ名前のCookieが見つかるかどうかを確認してください。

これはすべて、Cookie がセッションで積極的な役割を果たしていることを示しているため、クライアントが Cookieをサポートしていない場合、現在行っている方法でセッションを行うことはできません..少なくともそれらの場合はそうではありません代替クライアント。サーバー上にセッションが作成されます。問題は、クライアントが参加しているかどうかです。

クライアントが Cookie を使用できない場合は、別の方法でセッション ID をサーバーに渡す必要があります。これは、たとえばクエリ文字列で行うことができますが、この方法でセッション ID を送信することは少しプライベートではないと考えられています。

mysite.com?PHPSESSID=10alksdjfq9e

これを具体的に行う方法は、PHP のバージョンによって異なる場合がありますが、基本的には単なる構成です。適切なランタイム オプションが設定されている場合、PHP はセッション ID をクエリ パラメータとしてページ上のリンクに透過的に追加します (もちろん、同じソースのみ)。設定の詳細については、PHP Web サイトを参照してください。

補足: 数年前、これはセッションを実装しようとする際によくある問題でした。Cookie はより新しく、多くの人がセキュリティ上の懸念から、ブラウザで Cookie のサポートをオフにしていました。

補足: @Uberfuzzyは良い点を示しています。curl または wget でセッションを使用することは実際に可能です。問題は、自動化が少ないことです。ユーザーは、ヘッダー値をファイルにダンプし、将来の要求でその値を使用する場合があります。curl にはいくつかの「Cookie 認識」フラグがあり、これによりこれをより簡単に処理できますが、それでも明示的に行う必要があります。繰り返しますが、これを有利に利用できます。代替クライアントで curl が使用可能な場合は、Cookie 認識フラグを使用して、自分で呼び出しを行うことができます。curl のマニュアルを参照してください。

于 2008-10-04T09:17:55.970 に答える
2

ブラウザがページをリクエストしている場合にのみ、PHP セッションが作成されますか?

短い答え: はい。セッションは、ブラウザの機能を利用して HTTP ステートレスの問題を解決するために特別に作成されました。APC、memcached、DB などは関係ありません。これらはセッションの単なる保存方法であり、同じ問題に悩まされます。

より長い答え: セッションの概念は、HTTP がステートレス プロトコルであるという事実を説明するために作成されました。その状態は、さまざまなソフトウェア アプリケーションにとって非常に重要であることがわかります。

セッションを実装する最も一般的な方法は、Cookie を使用することです。PHP はセッション ID を Cookie で送信し、ブラウザはセッション ID を含む Cookie を返します。この ID は、セッションで保存した情報を検索するためにサーバーで使用されます。PHP には、URL の末尾にセッション ID を含めて読み取る機能がありますが、これは、ユーザーが生成されたセッション ID を含むリンクをクリックしてサイト/アプリケーションのページに移動することを前提としています。

特定のケースでは、curl (および場合によっては wget) で Cookie を使用することができます。CurlWeb ブラウザーであり、GUI を備えていません。使用しているコマンド ライン curl プログラムの場合 (C ライブラリ、PHP 拡張機能などではなく)、次のオプションを読んでください。

-b/--cookie
-c/--cookie-jar
-j/--junk-session-cookies
于 2008-10-04T18:00:04.980 に答える
2

session_start() を呼び出すと、クライアントが既存のセッションにない場合にセッションが作成されます。クライアントが、セッションを維持するために使用される Cookie またはクエリ文字列メカニズムをサポートしていない (または無視するように構成されている) 場合、要求ごとに新しいセッションが作成されます。

これにより、未使用のセッションでセッション ストレージ メカニズムが肥大化する可能性があります。

これが問題になる可能性が高いと思われる場合は、セッションに保存するものがある場合 (たとえば、ユーザーのログイン、またはロボットが行う可能性が低いもの) にのみ session_start() を呼び出すことをお勧めします。

于 2008-10-04T10:50:46.267 に答える