转: http://www.tuicool.com/articles/bqeeey
首先看下下面代码, session1.php 文件
<?php ini_set('session.save_path', './tmp/'); function open($save_path, $session_name) { echo __FUNCTION__,"<br/>"; return (true); } function close(){ echo __FUNCTION__,"<br/>"; return (true); } function read($id){ echo __FUNCTION__,"<br/>"; } function write($id, $sess_data){ echo __FUNCTION__,"<br/>"; return (true); } function destroy($id){ echo __FUNCTION__,"<br />"; return(true); } function gc($maxlifetime){ echo __FUNCTION__,"<br />"; return true; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); register_shutdown_function('test'); function test() { echo __FUNCTION__,"<br />"; } session_start(); echo 'aaaaa',"<br />"; /* 结论->session_start开启后, 会自动执行open,read函数。 等页面执行完后,会执行shutdown函数.最后后会把session写入进去,然后执行close关闭文件 从session_start 到页面结束,会一直锁定文件或者保持连接的。 */
然后通过1个实例子来理解 , 先执行 session2.php 代码, 20秒内执行 session3.php
session2.php 文件
<?php //执行 session2.php和session3.php, /* 因为 session2.php 脚本一直没有结束,结束后 session才会执行写入和关闭操作 (看session1.php 结论), session一直被锁定了 因此执行session3.php 时会发现 一直处于阻塞状态。 */ /* session_start(); $_SESSION['uname'] = 'lily'; sleep(20); */ //如果用以下代码 就没问题了, 立即提交 写入关闭 session_start(); $_SESSION['uname'] = 'lemon'; session_commit(); sleep(20);
session3.php 文件
<?php session_start(); echo $_SESSION['uname'];
总结:
//可以用 session_commit (别名 session_write_close) 立即执行写入关闭 /* session_start(); $_SESSION['aaaa'] = 1000; session_commit(); //执行commit后,直接会调用,wirte,close操作 */ /* 1.只读取session页面,建议打开后,就直接commit,这是$_SESSION变量已经生成了。 2.有对session进行写入页面,建议修改完$_SESSION后,直接调用commit 3.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非,中间执行很耗时的业务。 后记:其实,使用完session,随手commit也不是坏事,养成习惯后。可以节省性能,减少服务器开销。是个不错选择!欢迎大家交流! * /