ホームページ > バックエンド開発 > PHPチュートリアル > カスタムセッション処理 読み取りおよび書き込み順序の問題について

カスタムセッション処理 読み取りおよび書き込み順序の問題について

WBOY
リリース: 2016-06-23 13:36:55
オリジナル
938 人が閲覧しました

header("content-type:text/html;charset=utf-8");

define('SESSION_PRE', 'XX_');
define('BR', '
');
function start ($savePath , $sessionName) {
global $sessionPath;
$sessionPath = $savePath 。 DIRECTORY_SEPARATOR;
エコー __方法__ 。 BR;
trueを返します。
}

function close () {
echo __METHOD__ 。 BR;
trueを返します。
}

function read ($sessionId) {
global $sessionPath, $sessionFile;
$sessionFile = $sessionPath 。 DIRECTORY_SEPARATOR 。 ESSION_PRE 。 $セッションID;
エコー __方法__ 。 BR;
return @file_get_contents($sessionFile);

}

function write ($sessionId , $data) {
global $sessionFile;
$sessionFile = $sessionPath 。 DIRECTORY_SEPARATOR 。 ESSION_PRE 。 $セッションID;
エコー __方法__ 。 BR;
return @file_put_contents($sessionFile,$data);
}

function destroy ($sessionId) {
global $sessionFile;
@unlink($sessionFile);
エコー __方法__ 。 BR;
trueを返します。
}

function gc ($maxLifeTime) {
echo __METHOD__ 。 BR;
グローバル $sessionPath;
foreach(glob($sessionPath."/*") as $file){
if (filemtime($file)+$maxLifeTime @unlink($file);
}
}
trueを返します。
}
session_set_save_handler("開始", "閉じる", "読み取り", "書き込み", "破棄", "gc");

session_start();      //101行
$_SESSION['name'] = 'リエライ';          //102行
print_r($_SESSION);          //103行
?>

説明:
我的理解session_start() 開始後、逐次実行される関数は start、read、write、close です。
官方提供: PHP 会議は実行完了または session_write_close() 関数を使用しますその後、write 関数を使用します。

那么、最初にこの脚本を 103 行まで実行したとき、何会がリレイを出力するために、今回 $_SESSION 内のデータは
セッション文書から読み取られたものですか? 結果として、脚本はまだ終了していません,怎么会はwrite呢を実行しますか?そうでない場合、
今回の$_SESSIONは普通の数組に相当しますか?103行は出力された普通の数組ではありませんか?


回复讨论(解决方案)

求解释

依次输出

start
read
Array ( [name] => Lierei )
write
閉じる
怎么不对呢?

print_r($_SESSION) ; 後就ですか?>
これ不就表示程序结束了吗?

$_SESSION は超全局数组、指示不要出现在程序の任意の場所

依次出

start
read
Array ( [name] => Lierei )
書く
閉じる
怎么不对呢?

print_r($_SESSION); 後就ですか?>
これはプログラムが完了したことを示しているのではありませんか?

$_SESSION は超全局数であり、指示不要でプログラムのどこにでも表示できます

如果print_r($_SESSON); 後続の追加条項。これは最初の行行 程序103行に達し、次の部分を追加します、怎么$_session理面就有值了?

1. session_start(); が実行されると $_SESSON が生成されます
2. print_r($_SESSION) の後にいくつかの echo 'xxxx'; を追加すると、それが表示されます
3. $_SESSION['name'] = 'Lierei'; なぜ $_SESSION には値がないのでしょうか?

1. session_start(); が実行されると $_SESSON が生成されます
2. print_r($_SESSION) の後にいくつかの echo 'xxxx'; を追加すると、それが表示されます
3. $_SESSION['name ' ] = 'Lierei'; $_SESSION に値がないのはなぜですか?


内部の実行原理を理解したいだけですが、session_start() の後に複数の関数が実行されます。公式の声明では、スクリプトが実行されるか、session_write_close() 関数が呼び出された後に、PHP は write 関数を呼び出します。

次に、print が最初に実行され、その後プログラムが終了します。つまり、print が最初に実行され、その後 write がまだ実行されていないのに、なぜ出力されるのかわかりません。

1、 session_start(); が実行されると $_SESSON が生成されます

2. print_r($_SESSION) の後にいくつかの echo 'xxxx'; を追加すると、それが表示されます
3. $_SESSION[' name'] = ' Lierei' 、なぜ $_SESSION に値がないのでしょうか?

内部の実行原理を理解したいだけですが、session_start() の後に複数の関数が実行されます。公式の声明では、スクリプトが実行されるか、session_write_close() 関数が呼び出された後に、PHP は write 関数を呼び出します。


次に、print が最初に実行され、その後プログラムが終了します。私が言っているのは、print が最初に実行され、その後 write がまだ実行されていないのに、なぜ出力されるのかわかりません。 $_SESSION が存在します メモリ内では、session_write_close() がセッション データをサーバー上のセッション ファイルに書き込みます。したがって、ファイルに書き込む前に、セッションの値と設定はすべて $_SESSION 変数に基づいています。

ページはまだ終了していないため、session_write_close() は実行されません。そのため、セッション ファイルを更新する代わりに、取得できるのはストレージ内のセッション値だけです。
うーん、そうだと思いますが、あくまで推測なので聞いてみます、ご回答ありがとうございます
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート