3

スクリプトの実行中に PHP セッションがタイムアウトした場合、$_SESSION 配列の内容はスクリプトの実行が終了するまで利用できるのでしょうか? 例えば:

session_start();

if(! isset($_SESSION['name'])) {
    echo 'Name is not set';
    exit;
}

// imagine there is a bunch of code here and that the session times out while
// this code is being executed

echo 'Name is ', $_SESSION['name']; // will this line throw an error?

セッション変数をローカル スコープにコピーして、後でセッション タイムアウトをチェックしなくてもスクリプトで読み取ることができるようにすることは実用的ですか? 何かのようなもの:

session_start();

if(isset($_SESSION['name'])) {
    $name = $_SESSION['name'];
} else {
    echo 'Name is not set';
    exit;
}

// bunch of code here

echo 'Name is ', $name;
4

4 に答える 4

7

そのようなことについて心配しないでください。セッションには何も起こりません。によって初期化されsessioni_start()$_SESSION スクリプト内で常に使用できます。

于 2009-06-16T17:47:31.883 に答える
2

デフォルトの3時間のセッション有効期間は、セッションを開くたびにリセットされるsession_cache_expireため(を参照)、リクエストの途中でセッションがタイムアウトする唯一の方法は、リクエストの処理に3時間かかる場合です。デフォルトでは、PHPリクエストはわずか30秒後にタイムアウトするため、リクエスト中にセッションが期限切れになる危険はありません。さらに、$_SESSIONリクエストの途中で変数が突然変更されることはありません。セッションの開始時に入力され、それだけです。

于 2009-06-16T17:56:58.843 に答える
2

変数は最初のリクエストで $_SESSION グローバルにコピーされるため、ローカル変数にコピーするのと同じ効果があります。

ただし、わかりやすくするために、ローカル変数にコピーするのが理にかなっています。特に、変数を数回使用する予定がある場合。$_SESSION['variable'] があちこちにあるコードを読むのは難しい場合があります。

于 2009-06-16T18:00:42.033 に答える
0

理解する必要があるのは、セッションがどのように機能するかです。$ _SESSIONスーパーグローバルを使用してスクリプトにアクセスするクライアントは、それらに属するセッションのキーのみを知っています(Cookie / URLに保存)。これは、セッションデータ自体がクライアントとは何の関係もないことを意味します。使用したいセッションデータのキーがあれば、それを使用できます。古いバージョンのPHPには、簡単にアクセスできる場所にセッションが保存されていたため、いくつかのセキュリティホールがありました(詳細は覚えていません)。

基本的に、PHPスクリプトにセッションIDがある場合、マシンのメモリがフラッシュされたり、ハードドライブが破損したりしない限り(つまり、コンピュータの再起動/デバイスの障害)、そのセッションにアクセスできます。

これがお役に立てば幸いです。そうでない場合は、php.netにアクセスして、セッションの動作の詳細を確認してください。

于 2009-06-16T17:52:56.260 に答える