6

SOに関する多くの質問を含む、Web上のマニュアルとさまざまなページを読んでいます。session_destroy()ただし、セッション データの設定を解除する他の手段と組み合わせて PHPの概念を理解することはまだできていません。

スーパーグローバル配列の外部にセッション変数を登録しないサイトでは、これを考慮してください。$_SESSION

session_start();
$_SESSION = array();
session_regenerate_id(true); // New cookie + old session file on server deleted
session_destroy();  // What does PHP do here that was not done above?

私は何年もの間、機能するログイン/ログアウト スクリプトを作成してきたことに注意してください。この質問は物事を機能させることに関するものではありませんが、何が起こっているのかを正確に理解したいと思っています。

(SOに関する多くの回答では、session_unset()登録された変数の設定を解除するものも使用されています。ただし、私は決して使用session_register()しないため、非常に冗長に思えます。)

4

2 に答える 2

4

ソースに行きましょう。文字通り。

session_destroy()session_regenerate_id()はどちらもPHP ソースのext/session/session.cに実装されています。true を に渡すと、基になるセッション保存ハンドラでs_destroysession_regenerate_idが呼び出されることは、簡単に読めば明らかです。これは、 によって行われた呼び出しとまったく同じです。svn Blame によると、この動作は少なくとも 2005 年から変わっていません。session_destroy

session_destroyphp_rshutdown_session_globalsはとをさらに 2 回呼び出しますphp_rinit_session_globals。とりわけ、これによりsession_destroy()save ハンドラで close 関数が呼び出されますが、これはリクエストが完了すると自動的に行われます ( PHP_RSHUTDOWN_FUNCTIONを参照)。また、セッションを非アクティブ状態 ( を呼び出す前など) にリセットします。これは、 session_status()session_startを呼び出すことで確認できます(php 5.4 で導入)。

このすべてから得られるのは、 を呼び出すsession_destroy 前に呼び出す必要がないということですsession_regenerate_id(true)。ただし、セッションをリセットしたい場合は、のにそれを呼び出す必要があります。そうしないと、セッションがまだアクティブであり$_SESSION、要求が終了したときに保存ハンドラーによって の現在の内容がストレージに書き込まれるためです。

于 2013-08-16T05:24:32.667 に答える