PHP实现提高SESSION响应速度的几种方法详解(2)

<?php
session_start();
$_SESSION['name']='koastal';
sleep(10); //sleep 10s 模拟文件上传耗时

index.php

<?php
session_start();
var_dump($_SESSION);

通过上面的分析可以知道,session在页面执行完毕之后,才会写入到文件中,并释放文件锁。session的功能,我们一般都是在页面中的一部分用到的,当我们处理完session之后,可以使用session_commit()或者session_write_close()函数,提前将session的值写入到文件中,并释放文件锁。

session_commit过程分析

include "session_function.php"; 
//session_function.php代码在附录
session_start();
$_SESSION['name']="koastal";
session_commit();
echo "<br/>html content<br/>";
var_dump($_SESSION);
echo "<br/>";

输出结果

open
read
write
close

html content
array (size=1)
  'name' => string 'koastal' (length=7)

shutdown

我们可以看到,在执行了session_commit()之后,就提前将session内容写到文件中,并且关闭文件(释放文件锁)了。

死锁示例优化后程序

upload.php

<?php
session_start();
$_SESSION['name']='koastal';
session_commit();
sleep(10); //sleep 10s 模拟文件上传耗时

我们操作完session之后,先讲session数据写入到文件,然后再执行上传过程,就不会影响到其他页面使用该session文件了。

执行完session_commit之后

<?php
session_start();
$_SESSION['name'] = "koastal";
session_commit();
echo $_SESSION['name'];

session_commit的另一个名字是session_write_close,也就是将session信息写入并关闭文件的意思。session_commit之后,虽然session文件已经关闭,但是页面还在执行,只要没有执行session_unset内存中就还保存着session的值,所以我们还可以获取和输出session的值。其实,这个时候我们还可以给session赋值,但是这个赋值只是赋值到内存中,因为文件已经关闭,所以其他页面时访问不到session_commit();之后设置的session的值。

销毁session

既然已经探讨了这么多session的问题了,那么我们在说一下用户注销时,销毁session的操作。

通过上面的分析,我们知道session的值会保存在内存和文件两个地方。
session_start()会将对应文件打开,并将session数据读入到内存。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5351.html