首页 >后端开发 >php教程 >自定义session处理 关于read write顺序问题

自定义session处理 关于read write顺序问题

WBOY
WBOY原创
2016-06-23 13:36:55925浏览

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

define('SESSION_PRE', 'XX_');
define('BR', '
');
function start ($savePath , $sessionName) {
    global $sessionPath;
    $sessionPath = $savePath . DIRECTORY_SEPARATOR;
    echo __METHOD__ . BR;
    return true;
}

function close () {
    echo __METHOD__ . BR;
    return true;
}

function read ($sessionId) {
    global $sessionPath, $sessionFile;
    $sessionFile = $sessionPath . DIRECTORY_SEPARATOR . ESSION_PRE . $sessionId;
    echo __METHOD__ . BR;
    return @file_get_contents($sessionFile);
    
}

function write ($sessionId , $data) {
    global $sessionFile;
    $sessionFile = $sessionPath . DIRECTORY_SEPARATOR . ESSION_PRE . $sessionId;
    echo __METHOD__ . BR;
    return @file_put_contents($sessionFile,$data);
}

function destroy ($sessionId) {
    global $sessionFile;
    @unlink($sessionFile);
    echo __METHOD__ . BR;
    return true;
}

function gc ($maxLifeTime) {
    echo __METHOD__ . BR;
    global $sessionPath;
    foreach(glob($sessionPath."/*") as $file){
if (filemtime($file)+$maxLifeTime     @unlink($file);
}
    }
    return true;
}
session_set_save_handler("start", "close", "read", "write", "destroy", "gc");

session_start();      //101行
$_SESSION['name'] = 'Lielei';          //102行
print_r($_SESSION);          //103行
?>

问题描述:
         按我的理解session_start()开启后,依次运行的函数是 start , read, write , close。
官方资料:PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用write函数。

那么,在第一次运行此脚本到103行时,为什么会输出Lilei呢,此时$_SESSION中的数据是
从session文件中读取出来的吗?如果是,脚本不是还没有结束吗,怎么会执行write呢?如果不是,
此时的$_SESSION只是相当于普通的数组吗?103行不过是输出一个普通的数组而已嘛?


回复讨论(解决方案)

求解释

依次输出
start
read
Array ( [name] => Lielei )
write
close
怎么不对呢?

print_r($_SESSION); 后就是 ?>
这不就表示程序结束了吗?

$_SESSION 是超全局数组,无需声明就可出现在程序的任何地方

依次输出
start
read
Array ( [name] => Lielei )
write
close
怎么不对呢?

print_r($_SESSION); 后就是 ?>
这不就表示程序结束了吗?

$_SESSION 是超全局数组,无需声明就可出现在程序的任何地方


如果print_r($_SESSON);后面再加几条语句呢。
我的意思是第一次运行   程序运行到103行 ,加入下面还有代码,怎么$_session理面就有值了?

1、$_SESSON 在 session_start(); 执行时生成
2、你在 print_r($_SESSION); 后面加几个 echo 'xxxx'; 不就看到了吗
3、你都 $_SESSION['name'] = 'Lielei';  了,$_SESSION 怎么会没有值呢?

1、$_SESSON 在 session_start(); 执行时生成
2、你在 print_r($_SESSION); 后面加几个 echo 'xxxx'; 不就看到了吗
3、你都 $_SESSION['name'] = 'Lielei';  了,$_SESSION 怎么会没有值呢?


我就是想搞清楚它的内部执行原理,session_start()后执行了多个函数,我看官方是:PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用write函数。

那么先执行了 print,然后才是程序结束,我说的是这个执行流程,既然先执行了print,那么还没有执行write,怎么就输出了呢
我不懂啊


1、$_SESSON 在 session_start(); 执行时生成
2、你在 print_r($_SESSION); 后面加几个 echo 'xxxx'; 不就看到了吗
3、你都 $_SESSION['name'] = 'Lielei';  了,$_SESSION 怎么会没有值呢?


我就是想搞清楚它的内部执行原理,session_start()后执行了多个函数,我看官方是:PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用write函数。

那么先执行了 print,然后才是程序结束,我说的是这个执行流程,既然先执行了print,那么还没有执行write,怎么就输出了呢
我不懂啊
$_SESSION是存在内存中的,session_write_close()是将session数据写入服务器端上的session文件的。所以在写入文件之前,你对session的取值和设置,都是针对$_SESSION这个变量的。

?面未?束,不??行session_write_close(); 所以不?更新到session文件,你?取的只是?存中的session的值。

嗯嗯,我猜也是这样,但只是猜测,所以来问下,谢谢回答

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn