- 浏览: 79164 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
memoryisking:
关于更多ConcurrentModificationExcep ...
java.util.ConcurrentModificationException原因 -
memoryisking:
关于更多TimeUnit的内容可以去看这里: 发生Concu ...
java.util.ConcurrentModificationException原因 -
yzzshmily:
yzzshmily 写道我今天也遇到这种情况了, checkC ...
谷歌浏览器中的 name 变量 -
yzzshmily:
我今天也遇到这种情况了, checkClientName(ne ...
谷歌浏览器中的 name 变量
http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议。所谓无状态,指的是不会维护http请求数据,http请求是独立 的,不持久的。而越来越复杂的WEB应用,需要保存一些用户状态信息。这时候,Session这种方案应需而生。PHP从4.1开始支持Session管理。
Session!它是很抽象的一个概念。我们不妨先从与它几个息息相关的有迹可寻的小切入点入手,然后逐渐地认识了解Session!
Session存储
首先,我们为什么需要Session,就是因为我们需要:存储各个用户的状态数据。那么试问,如果由你来设计解决这个需求的方案,那么也许你会设置这样一个数据表用与存储各个用户的状态信息
uid | created | data | max_age |
94c55770fdf044a7 | 1270802787 | jtUsername=admin | 14400 |
2c37df64277e4409 | 1270822787 | jtUsername=Joe;jtBooks=8; | 14400 |
… | … | … | … |
uid : 用户唯一标识符,区分其它用户 created : 记录产生时间
data : 存放与用户相关的数据 max_age : 记录的有效时间
同样地,PHP设计管理session方案也大致如此,它分别包含了以下信息:
1,session id
用户session唯一标识符,随机生成的一串字符串,具有唯一性,随机性。主要用于区分其它用户的session数据。用户第一次访问web页面的时候,php的session初始化函数调用会分配给当前来访用户一个唯一的ID,也称之为session_id。
2,session data
我们把需要通过session保存的用户状态信息,称为用户session数据,也称为session数据。一般是在当前session生命周期,相应用的$_SESSION数据。
3,session file
PHP默认将session数据存放在一个文件里。我们把存放session数据的文件称为session文件。它由特殊的php.ini设置
session.save_path指定session文件的存放路径,CentOS5.3操作系统,PHP5.1默认存放在/var/lib/php
/session目录中。用户session文件的名称,就是以sess_为前缀,以session_id为结尾命名,比如session
id为vp8lfqnskjvsiilcp1c4l484d3,那么session文件名就是
sess_vp8lfqnskjvsiilcp1c4l484d3
4,session lifetime
我们把初始化session开始,直到注销session这段期间,称为session生命周期,这样有助于我们理解session管理函数。
由此,我们可见:当每个用户访问web, PHP的session初始化函数都会给当前来访用户分配一个唯一的session ID。并且在session生命周期结束的时候,将用户在此周期产生的session数据持久到session文件中。用户再次访问的时 候,session初始化函数,又会从session文件中读取session数据,开始新的session生命周期。
与session存储相关php.ini设置
1,session.save_handler = file
用于读取/回写session数据的方式,默认是files。它会让PHP的session管理函数使用指定的文本文件存储session数据
2,session.save_path = “/var/lib/php/session”
指定保存session文件的目录,可以指定到别的目录,但是指定目录必须要有httpd守护进程属主(比如apache或www等)写权限,否则无法回
存session数据。当指定目录不存在时,php session环境初始化函数是不会帮你创建指定目录的,所以需要你手工建立指定目录。
它还可以写成这样session.save_path = “N;/path” 其中N是整数。这样使得不是所有的session文件都保存在同一个目录中,而是分散在不同目录。这对于服务器处理大量session文件是很有帮助的。(注:目录需要自己手工创建)
3,session.auto_start = 0
如果启用该选项,用户的每次请求都会初始化session。我们推荐不启用该设置,最好通过session_start()显示地初始化session。
Session同步数据
一旦调用了session_start()初始化session,就意味着开始了一个session生命周期。也就是宣布了,可以使用相关函数操 作$_SESSION来管理session数据。这个session生命周期产生的数据并没有实时地写入session文件,而是通过$_SESSION 变量寄存在内存中。那么,寄存在内存的数据什么时候会写入到session文件?这也是我们这一小节的主要测试内容。
在进行测试之前,先让我们介绍几个影响session数据的PHP函数、或事件
1,session_start()
函数session_start会初始化session,也标识着session生命周期的开始。要使用session,必须初始化一个session环境。有点类似于OOP概念中调用构造函数构创建对象实例一样。
session初始化操作,声明一个全局数组$_SESSION,映射寄存在内存的session数据。如果session文件已经存在,并且保存有
session数据,session_start()则会读取session数据,填入$_SESSION中,开始一个新的session生命周期。
2,$_SESSION
它是一个全局变量,类型是Array,映射了session生命周期的session数据,寄存在内存中。在session初始化的时候,从session文件中读取数据,填入该变量中。在session生命周期结束时,将$_SESSION数据写回session文件。
3, session_register()
在session生命周期内,使用全局变量名称将注全局变量注册到当前session中。所谓注册,就是将变量填入$_SESSION中,值为NULL。
它不会对session文件进行任何IO操作,只是影响$_SESSION变量。注意,它的正确写法是
session_register(‘varname’),而不是session_register($varname)
4,session_unregister()
与session_register操作正好相反,即在session生命周期,从当前session注销指定变量。同样只影响$_SESSION,并不进行任何IO操作。
5,session_unset()
在session生命周期,从当前session中注销全部session数据,让$_SESSION成为一个空数组。它与
unset($_SESSION)的区别在于:unset直接删除$_SESSION变量,释放内存资源;另一个区别在
于,session_unset()仅在session生命周期能够操作$_SESSION数组,而unset()则在整个页面(page)生命周期都能
操作$_SESSION数组。session_unset()同样不进行任何IO操作,只影响$_SESSION数组。
6,session_destroy()
如果说session_start()初始化一个session的话,而它则注销一个session。意味着session生命周期结束了。在
session生命周期结整后,session_register, session_unset,
session_register都将不能操作$_SESSION数组,而$_SESSION数组依然可以被unset()等函数操作。这
时,session意味着是未定义的,而$_SESSION依然是一个全局变量,他们脱离了关映射关系。
通过session_destroy()注销session,除了结束session生命周期外,它还会删除sesion文件,但不会影响当前$_SESSION变量。即它会产生一个IO操作。
7,session_regenerate_id()
调用它,会给当前用户重新分配一个新的session
id。并且在结束当前页面生命周期的时候,将当前session数据写入session文件。前提是,调用此函数之前,当前session生命周期没有被
终止(参考第9点)。它会产生一个IO操作,创建一个新的session文件,创建新的session文件的是在session结束之前,而不是调用此函
数就立即创建新的session文件。
8,session_commit()
session_commit()函数是session_write_close()函数的别名。它会结束当前session的生命周期,并且将
session数据立即强制写入session文件。不推荐通过session_commit()来手工写入session数据,因为PHP会在页面生命
周期结束的时候,自动结束当前没有终止的session生命周期。它会产生一个IO写操作
9,end session
结束session,默认是在页面生命周期结束的之前,PHP会自动结束当前没有终止的session。但是还可以通过session_commit()
与session_destroy()二个函数提前结束session。不管是哪种方式,结束session都会产生IO操作,分别不一样。默认情况,产
生一个IO写操作,将当前session数据写回session文件。session_commit()则是调用该函数那刻,产生一个IO写操作,将
session数据写回session文件。而session_destroy()不一样在于,它不会将数据写回session文件,而是直接删除当前
session文件。有趣的是,不管是session_commit(),还是session_destroy()都不会清空$_SESSION数组,更
不会删除$_SESSION数组,只是所有session_*函数不能再操作session数据,因为当前的session生命周期终止了,即不能操作一
个未定义对象。
为了验证以上陈述,我们可以做以下测试
任务一:观察session初始化与默认结束session的时候,产生的IO
<?php //@file test_session_2.php session_start(); $pg_uuid = 'ac606826-9620-490b-b850-ea9dbce6cfd5'; //注册全局变量pg_uuid到session,但$_SESSION['pg_uuid']值为NULL,只影响$_SESSION session_register('pg_uuid'); var_dump($_SESSION); fopen(__FILE__, "r"); ?>
[root@localhost ~]# strace -p `cat /var/run/httpd.pid` Process 21819 attached - interrupt to quit ... st_mode=S_IFREG|0644, st_size=72, ...}) = 0 open("/var/www/html/test_session.php", O_RDONLY) = 17 fstat64(17, {st_mode=S_IFREG|0644, st_size=72, ...}) = 0 lseek(17, 0, SEEK_CUR) = 0 read(17, "<p;?php\n//@file test_session.php\ns"..., 8192) = 72 read(17, "", 8192) = 0 read(17, "", 8192) = 0 close(17) = 0 gettimeofday({1270906664, 11602}, NULL) = 0 open("/var/lib/php/session/sess_4j38nv7l1fq1bj6n80l6g9cum5", O_RDWR|O_CREAT, 0600) = 17 flock(17, LOCK_EX) = 0 fcntl64(17, F_SETFD, FD_CLOEXEC) = 0 fstat64(17, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 time(NULL) = 1270906664 open("/var/www/html/test_session.php", O_RDONLY) = 18 fstat64(18, {st_mode=S_IFREG|0644, st_size=72, ...}) = 0 lseek(18, 0, SEEK_CUR) = 0 close(18) = 0 chdir("/var/lib/php/session") = 0 pwrite64(17, "", 0, 0) = 0 close(17) = 0 setitimer(ITIMER_PROF, {it_interval={0, 0}, itvalue={0, 0}}, NULL) = 0 writev(16, [{"HTTP/1.1 200 OK\r\nDate: Sat, 10 A"..., 385}], 1) = 385 write(12, "192.168.0.98 - - [10/Apr/2010:21"..., 207) = 207 shutdown(16, 1 /* send */) = 0 epoll_wait(15,
蓝色加粗,通过系统内核函数open调用打开session文件,这是由session_start()产生的调用,注意这里并没有产生读文件操 作。红色部分,将一个空字符串写入session文件。由此可见session初始化在页面生命周期开始之时,手工调用session_start可以初 始化session文件,而在页面生命周期结束之时,会自动地注销session,结束当前session生命周期,同时在此周期产生的session数 据写回session文件,我们把这种方式结束的session,称为session默认结束。
任务2.观察session_register()查看它是否会产生磁盘操作,还是只操作$_SESSION。
<?php //@file test_session_2.php session_start(); $pg_uuid = 'ac606826-9620-490b-b850-ea9dbce6cfd5'; session_register('pg_uuid'); //注册全局变量pg_uuid到session,但值为NULL,只影响$_SESSION var_dump($_SESSION); fopen(__FILE__, "r"); ?>
[root@localhost ~]# strace -p `cat /var/run/httpd.pid` Process 21819 attached - interrupt to quit ... open("/var/www/html/test_session_2.php", O_RDONLY) = 17 fstat64(17, {st_mode=S_IFREG|0644, st_size=148, ...}) = 0 lseek(17, 0, SEEK_CUR) = 0 read(17, "<?php\nsession_start();\n$pg_uuid "..., 8192) = 148 read(17, "", 8192) = 0 read(17, "", 8192) = 0 close(17) = 0 open("/var/lib/php/session/sess_4j38nv7l1fq1bj6n80l6g9cum5", O_RDWR|O_CREAT, 0600) = 17 flock(17, LOCK_EX) = 0 fcntl64(17, F_SETFD, FD_CLOEXEC) = 0 fstat64(17, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 time(NULL) = 1270907613 open("/var/www/html/test_session_2.php", O_RDONLY) = 18 fstat64(18, {st_mode=S_IFREG|0644, st_size=148, ...}) = 0 lseek(18, 0, SEEK_CUR) = 0 close(18) = 0 chdir("/var/lib/php/session") = 0 pwrite64(17, "pg_uuid|N;", 10, 0) = 10 close(17) = 0 setitimer(ITIMER_PROF, {it_interval={0, 0}, itvalue={0, 0}}, NULL) = 0 writev(16, [{"HTTP/1.1 200 OK\r\nDate: Sat, 10 A"..., 328}, {"array(1) {\n [\"pg_uuid\"]=>\n NUL"..., 36}], 2) = 364 write(12, "192.168.0.98 - - [10/Apr/2010:21"..., 210) = 210 shutdown(16, 1 /* send */) = 0 epoll_wait(15,
通过上面的观察,蓝色部分还是由session初始化(session_start)产生,注意这里依然没读文件操作,这是因为session文件 为空。红色部分,依然是默认结束session产生的文件写操作(pwrite)。由此,我们可以知道session_register()不会对 session文件操作,即不会把$_SESSION中的数据写回session文件,它没有产生任何IO操作。而只在session生命周期是影响当 前$_SESSION变量,即$_SESSION[‘pg_uuid’] = NULL。所以,推荐使用$_SESSION[‘pg_uuid’] = $pg_uuid;
任务3.观察session_destroy()与session_unset()的区别
<?php session_start(); echo "<br/>---1--<br/>"; $pg_uid = 1; //$_SESSION['pg_uid']; //该行会报一个Notice消息,即没有初始化该变量 $_SESSION['pg_name'] = 'boys'; //填入到$_SESSION变量,但不立即写入session文件,值为boys $pg_sex = 1; $pg_theme = 'default'; session_register('pg_sex'); //填入到$_SESSION变量,但不立即写入session文件,值为NULL session_register('pg_theme'); //填入到$_SESSION变量,但不立即写入session文件,值为NULL var_dump($_SESSION); //-- echo "<br/>---2--<br/>"; unset($_SESSION['pg_theme']); //从$_SESSION清除该元素,不立即同步到session文件 unset($_SESSION['pg_name']); //从$_SESSION清除该元素,不立即同步到session文件 session_unregister('pg_sex'); //从$_SESSION清除该元素,不立即同步到session文件 session_unregister('pg_uid'); //从$_SESSION清除该元素,不立即同步到session文件 var_dump($_SESSION); echo "<br/>---3--<br/>"; $_SESSION['pg_members'] = 5; //填入$_SESSION数组,但不立即同步到session文件,值为5 $pg_boy = 6; session_register('pg_boy'); //填入$_SESSION数组,但不立即同步到session文件,值为NULL session_unset($_SESSION); //清空$_SESSION var_dump($_SESSION); echo "<br/>---4--<br/>"; $_SESSION['pg_boss'] = 3; //填入$_SESSION数组,但不立即同步到session文件,值为3 $pg_girls = 6; session_register('pg_girls'); //填入$_session数组,但不立即同步到session文件,值为NULL session_destroy(); //注销session_destroy var_dump($_SESSION); echo "<br/>---5---<br/>"; session_unregister('pg_boss'); //pg_boss不会被清除,还为NULL session_unset(); //不会清空$_SESSION数组,因为session已被session_destroy注销 var_dump($_SESSION); fopen(__FILE__, "r"); //@这里是页面析构的时候-- 本应该将$_SESSION数据同步到session文件, 真的吗??? //@事实,没有发生任何IO操作,即没有将$_SESSION数据回写,怎么回事??? //@因为被session_destroy()消毁了session... ?>
程序输出: ---1-- array(3) { ["pg_name"]=> string(4) "boys" ["pg_sex"]=> NULL ["pg_theme"]=> NULL } ---2-- array(0) { } ---3-- array(0) { } ---4-- array(2) { ["pg_boss"]=> int(3) ["pg_girls"]=> NULL } ---5--- array(2) { ["pg_boss"]=> int(3) ["pg_girls"]=> NULL }
[root@localhost ~]# strace -p `cat /var/run/httpd.pid` Process 21819 attached - interrupt to quit ... open("/var/www/html/test_session_3.php", O_RDONLY) = 17 fstat64(17, {st_mode=S_IFREG|0644, st_size=706, ...}) = 0 lseek(17, 0, SEEK_CUR) = 0 read(17, "<?php\nsession_start();\necho \"<br"..., 8192) = 706 read(17, "", 8192) = 0 read(17, "", 8192) = 0 close(17) = 0 open("/var/lib/php/session/sess_4j38nv7l1fq1bj6n80l6g9cum5", O_RDWR|O_CREAT, 0600) = 17 flock(17, LOCK_EX) = 0 fcntl64(17, F_SETFD, FD_CLOEXEC) = 0 fstat64(17, {st_mode=S_IFREG|0600, st_size=10, ...}) = 0 pread64(17, "pg_uuid|N;", 10, 0) = 10 close(17) = 0 unlink("/var/lib/php/session/sess_4j38nv7l1fq1bj6n80l6g9cum5") = 0 time(NULL) = 1270910665 open("/var/www/html/test_session_3.php", O_RDONLY) = 17 fstat64(17, {st_mode=S_IFREG|0644, st_size=706, ...}) = 0 lseek(17, 0, SEEK_CUR) = 0 close(17) = 0 chdir("/var/lib/php/session") = 0 setitimer(ITIMER_PROF, {it_interval={0, 0}, itvalue={0, 0}}, NULL) = 0 ... write(12, "192.168.0.98 - - [10/Apr/2010:22"..., 211) = 211 shutdown(16, 1 /* send */) = 0
蓝色部分是我们熟悉的session初始化的时候产生的open系统内核调用。绿色部分,是一个IO读操作,因为上一次访问页面的时候,产生了 session数据,所以这一次会将上次的session填入$_SESSION中。红色部分,可以看出,这里调用unlink删除session文件, 而且后面(页面生命周期结束时),一直没有看到前两例看到的任何与session文件有关的IO写操作,即没有将$_SESSION中的数据写回 session文件。我们也没有在session.save_path找到相应的session文件
[ root@ localhost html] # ls /var/lib/php/session/sess_4j38nv7l1fq1bj6n80l6g9cum5 ls : / var/ lib/ php/ session/ sess_4j38nv7l1fq1bj6n80l6g9cum5: No such file or directory
注:虽然删除了session文件,但用户再次访问web的时候,并不会给用户重新分配一个新的session id,而是依然用该session id,并且会重新创建文件名相同的session文件,即sess_SESSION-ID
任务4:测试并观察session_regenerate_id行为,以及$_SESSION的变化
<?php session_start(); $_SESSION['pfid'] = 123; var_dump($_SESSION); session_regenerate_id(); var_dump($_SESSION); fopen(__FILE__, "r"); ?>
[root@localhost ~]# strace -p `cat /var/run/httpd.pid` Process 22641 attached - interrupt to quit ... open("/var/www/html/test_session_4.php", O_RDONLY) = 17 fstat64(17, {st_mode=S_IFREG|0644, st_size=141, ...}) = 0 lseek(17, 0, SEEK_CUR) = 0 read(17, "<?php\nsession_start();\n$_SESSION"..., 8192) = 141 read(17, "", 8192) = 0 read(17, "", 8192) = 0 close(17) = 0 open("/var/lib/php/session/sess_4j38nv7l1fq1bj6n80l6g9cum5", O_RDWR|O_CREAT, 0600) = 17 flock(17, LOCK_EX) = 0 fcntl64(17, F_SETFD, FD_CLOEXEC) = 0 fstat64(17, {st_mode=S_IFREG|0600, st_size=11, ...}) = 0 pread64(17, "pfid|i:123;", 11, 0) = 11 gettimeofday({1270915896, 122016}, NULL) = 0 time(NULL) = 1270915896 open("/var/www/html/test_session_4.php", O_RDONLY) = 18 fstat64(18, {st_mode=S_IFREG|0644, st_size=141, ...}) = 0 lseek(18, 0, SEEK_CUR) = 0 close(18) = 0 chdir("/var/lib/php/session") = 0 close(17) = 0 open("/var/lib/php/session/sess_qoa6knu9fg77un8le99o1vk1c7", O_RDWR|O_CREAT, 0600) = 17 flock(17, LOCK_EX) = 0 fcntl64(17, F_SETFD, FD_CLOEXEC) = 0 pwrite64(17, "pfid|i:123;", 11, 0) = 11 close(17) = 0 setitimer(ITIMER_PROF, {it_interval={0, 0}, itvalue={0, 0}}, NULL) = 0 writev(16, [{"HTTP/1.1 200 OK\r\nDate: Sat, 10 A"..., 386}, {"array(1) {\n [\"pfid\"]=>\n int(12"..., 75}], 2) = 461 write(12, "192.168.0.98 - - [11/Apr/2010:00"..., 210) = 210 shutdown(16, 1 /* send */) = 0
请注意观察,蓝色部分, session初始化打开的session文件是sess_4j38nv7l1fq1bj6n80l6g9cum5,这也验证了上一例的陈述。而绿色加粗 部分,而这次打开的是新session文件sess_qoa6knu9fg77un8le99o1vk1c7,并且将session数据写入到了新的 session文件中。值得注意的是,打开新文件的时候,是发生在fopen(__FILE__, ‘r’)之后,在回写session数据到session文件之前open的新session文件。可 见,session_regenerate_id()会给当前用户重新分配一个新的session id,并将当前session数据写入新的session文件,另外不会删除旧的session文件。通过文件列表,也验证了,正是如此
[root@localhost html]# ls -lt /var/lib/php/session/ -rw------- 1 apache apache 11 Apr 11 00:11 sess_qoa6knu9fg77un8le99o1vk1c7 -rw------- 1 apache apache 11 Apr 11 00:08 sess_4j38nv7l1fq1bj6n80l6g9cum5 -rw------- 1 apache apache 0 Apr 10 17:37 sess_ktj0giniplqf51nravl1fsga72
任务5.:测试并观察session_commit()是否会像session_destroy注销session,什么时候进行IO写操作
<?php session_start(); echo "-----<br />---"; var_dump($SESSION); echo "<br />-----<br />---"; $SESSION['pfguest'] = 'guest'; session_commit(); var_dump($SESSION); echo "<br />-----<br />---"; session_unset(); var_dump($SESSION); fopen(__FILE__, 'r'); ?>
程序输出如下: -----1---array(1) { ["pfid"]=> int(123) } -----2---array(2) { ["pfid"]=> int(123) ["pfguest"]=> string(5) "guest" } -----3---array(2) { ["pfid"]=> int(123) ["pfguest"]=> string(5) "guest" }
[root@localhost ~]# strace -p `cat /var/run/httpd.pid` Process 22641 attached - interrupt to quit ... open("/var/www/html/test_session_5.php", O_RDONLY) = 17 fstat64(17, {st_mode=S_IFREG|0644, st_size=246, ...}) = 0 lseek(17, 0, SEEK_CUR) = 0 read(17, "<?php\nsession_start();\necho \"---"..., 8192) = 246 read(17, "", 8192) = 0 read(17, "", 8192) = 0 close(17) = 0 open("/var/lib/php/session/sess_qoa6knu9fg77un8le99o1vk1c7", O_RDWR|O_CREAT, 0600) = 17 flock(17, LOCK_EX) = 0 fcntl64(17, F_SETFD, FD_CLOEXEC) = 0 fstat64(17, {st_mode=S_IFREG|0600, st_size=11, ...}) = 0 pread64(17, "pfid|i:123;", 11, 0) = 11 pwrite64(17, "pfid|i:123;pfguest|s:5:\"guest\";", 31, 0) = 31 close(17) = 0 time(NULL) = 1270927098 open("/var/www/html/test_session_5.php", O_RDONLY) = 17 fstat64(17, {st_mode=S_IFREG|0644, st_size=246, ...}) = 0 lseek(17, 0, SEEK_CUR) = 0 close(17) = 0 chdir("/var/lib/php/session") = 0 setitimer(ITIMER_PROF, {it_interval={0, 0}, itvalue={0, 0}}, NULL) = 0 writev(16, [{"HTTP/1.1 200 OK\r\nDate: Sat, 10 A"..., 329}, {"-----1---array(1) {\n [\"pfid\"]=>"..., 222}], 2) = 551 write(12, "192.168.0.98 - - [11/Apr/2010:03"..., 211) = 211 shutdown(16, 1 /* send */) = 0
观察测试结果,蓝色部分照旧是session初始化的时候产生的系统内核open调用,接着绿色部分是一个IO读操作,即读取session文件中 的数据,由第一个var_dump($_SESSION)输出。随后,往session加入新的一条已定义了的session记录,并且通过 session_commit()将记录写回去。红色部分就是由session_commit产生的一次IO写操作。之 后,session_unset()并没有生效,同时,我们也没有在页面生命周期结束的时候看到任何与session文件有关的IO写操作。这也正说明 了,session_commit()调用的当下,就会将session数据写回session文件,并且会像session_destroy一样注销 session,但与session_destroy不同的时,session_commit不会删除session文件,而且会将当前的session 数据写回session文件。我们可以查看,调用session_commit之后,session文件还是依然存在的
[root@localhost html]# ls -lt /var/lib/php/session -rw------- 1 apache apache 31 Apr 11 03:18 sess_qoa6knu9fg77un8le99o1vk1c7 -rw------- 1 apache apache 11 Apr 11 00:08 sess_4j38nv7l1fq1bj6n80l6g9cum5 …
总结
1,用户注销web应用系统,最好的调用方式依次是session_unset(); session_destroy(); unset($_SESSION);
<?php function user_sigout() { global $user; sys_event_register('user_sigout', $user); session_unset(); //清空session session_destroy(); //删除session文件 if (isset($_SESSION)) { unset($_SESSIONI); //注销$_SESSION } return TRUE; } ?>
2,尽量将键与值填入$_SESSION,而不推荐使用session_register()。同样,尽量使用unset($_SESSION[‘var’]),而不使用session_unregister()。
3,对于可能产生大量session的WEB应用,推荐使用的session.save_path的格式是session.save_path=”N:/path”。注意:这些目录需要手工创建,并且有httpd守护进程属主写权限。这样做可以获得更好的性能
4,如果调用了session_regenerate_id()给用户分配了新的session id。该函数并不会主动删除旧的session文件,需要定时清理旧的session文件,这样更优化。
5,尽量不要使用session_commit()提交sessioin数据,因为它同时会结束当前session,PHP默认会在页面生命周期的时候提交session数据到session文件
发表评论
-
PHP实现双向链表
2013-10-21 10:12 682<?php /** * **双向链表 ... -
php=操作符的优先级问题
2013-09-06 16:07 737$a = '1'; $b = '2'; $c = ... -
php-gtk to exe
2013-07-15 15:48 685以前PHP被认为只能用来编写服务器端的CGI程序,如果说PHP ... -
PHP 类型及比较符表
2013-02-22 18:13 649<!--[if gte mso 9]><x ... -
xhprof安装&&使用
2013-01-04 11:24 762编译安装 wget http://pecl.php ... -
PHP变量的存储方式
2012-11-16 18:18 1284当用户在PHP中调用一个 ... -
【转】PHP通过接口实现多重继承
2012-11-06 11:41 711PHP类虽然是单继承的,但是可以通过其它特殊的方式实现多重 ... -
【社区开学季】Php提升效率优化技巧
2012-10-16 10:29 654确实很有用的,大家平常开发中应该注意下 0、用单引号代替双引 ... -
为什么$row[’id’] 的速度是$row[id]的7倍
2012-10-16 10:06 1297$row[’id’] 的速度是$row[id]的7倍 ... -
PHP true
2012-08-08 17:35 1$arr = true; if ($arr == -1) { ... -
[转]PHP5 Session 浅析II
2012-05-10 11:44 1283PHP5 Session 浅析II 我们 ... -
PHP的__FUNCTION__与__METHOD__的不同
2012-03-02 10:54 691使用__FUNCTION__仅传回函数名称 使用__METH ...
相关推荐
本文在PHP中利用MD5()函数对Session值以及SessionID值进行Hash处理,确切地说,是在SessionID值的储存机制上添加了MD5算法,作了一些浅析,相信在Session安全防范方面会起到一定的作用。 MD5算法与Session Hash ...
PHP 中 i++ 和 ++i 的区分及效率浅析 PHP 中的 i++ 和 ++i 都是递增运算符,但它们的执行顺序和返回值不同。 i++ 运算符 i++ 运算符是后缀递增运算符,它的执行顺序如下: 1. 返回当前变量的值 2. 将变量的值加 ...
PHP的Session反序列化漏洞问题,主要是因为不当的Session使用和不安全的反序列化操作,可能造成未授权访问、数据泄露甚至远程代码执行等安全风险。 首先,了解PHP的Session管理机制是非常重要的。在php.ini配置文件...
在PHP分布式环境中,Session管理是不可或缺的一环,它涉及到用户状态的保持和跨服务器的数据共享。Redis作为一种高性能的键值数据库,常被用于分布式环境下的Session存储,以解决传统文件或数据库Session管理的问题...
在进行Web应用程序开发的时候,人们经常会用Session存储数据。但可能有人不知道,在PHP中,Session使用不当可能会引起并发问题。印度医疗行业软件解决方案提供商Plus91 Technologies高级工程师Kishan Gor在个人博客...
PHP开发者在实际应用中,可以通过设置HTTP头来控制Cookies和Session的行为,比如使用`setcookie()`函数创建Cookies,使用`session_start()`启动Session,`$_SESSION`数组存储Session数据。同时,通过`header()`函数...
5. **使用最新版本的PHP**:定期更新PHP版本以获取最新的安全补丁。 6. **代码审计**:定期审查代码,查找和修复安全漏洞。 总的来说,提高PHP程序的安全性需要开发者对每个环节都保持警惕,从代码编写到部署维护,...
"浅析 PHP 博客管理系统的设计与实现" 本文主要介绍了基于 PHP 的博客管理系统的设计与实现。该系统采用 PHP+MySQL+Apache 技术架构,实现了博客管理系统的开发。系统分为三个模块:游客、普通用户和超级用户。每个...
4. **超全局(Superglobal)变量**:这些变量在整个脚本中始终可用,无论当前作用域如何,如`$_GET`、`$_POST`、`$_SESSION`等。它们在PHP 4.1.0版本后引入,不需要`global`关键字即可在函数内部使用。 了解这些...
- **XSS防护**:使用HTTP头部的Content-Security-Policy(CSP)来限制浏览器执行的脚本源,对输出内容进行HTML实体编码,启用HTTP-only cookies以保护session信息不被JavaScript访问。 3. 其他安全实践 - **使用...
### JSP安全编程实例浅析 #### 一、引言 在现代Web开发中,JavaServer Pages (JSP)作为一种动态网页技术被广泛应用于构建复杂的企业级应用。然而,随着互联网的发展,各种针对Web应用程序的安全威胁也日益增多。...
5. **局部变量**:函数内部定义的变量是局部的,只在函数执行期间存在,函数执行结束后,变量会被销毁。 理解变量和常量的作用域至关重要,因为这决定了它们在代码中的可见性和生命周期。在函数内部定义的变量仅在...
```php $model = M('MyTable'); $result = $model->execute('update MyTable set name=aaa where id=11'); // 将返回更新的行数 ``` 在这个例子中,`execute()` 返回的是被更新的记录数,即 `UPDATE` 语句影响的...
**浅析AJAX乱码及错误解决方案** 在当前的网络环境中,JavaScript被广泛应用于网页交互,而AJAX技术更是让动态加载数据变得无处不在。然而,由于编码规范的不一致,尤其是在各种浏览器环境中,经常会出现乱码和...
3. **核心类库加载**:引入必要的系统类库,如session、url、cache等。 4. **路由分发**:根据URL解析用户请求,分发到相应的控制器和方法处理。 5. **模板渲染**:渲染并输出最终的HTML页面。 四、模块开发目录...