集合所要求的成员不存在php word,PHP常见面试题汇总(二)

/**

* 【session.save_handler = files】:默认的session处理机制

*      (1)session_start()是session机制的开始,它有必定几率开启垃圾回收,由于session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个几率是根据php.ini的配置决定的,

可是有的系统是 session.gc_probability = 0,这也就是说几率是0,而是经过cron脚原本实现垃圾回收

session.gc_probability = 1  //垃圾回收机制

session.gc_divisor = 1000   //垃圾回收机制

session.gc_maxlifetime = 1440//过时时间 默认24分钟

//垃圾回收的概率为:session.gc_probability/session.gc_divisor,即:1/1000,

//不建议设置太小,由于session的垃圾回收,是须要检查每一个文件是否过时的。

session.save_path = //好像不一样的系统默认不同,有一种设置是 "N;/path"

//这是随机分级存储,这个样的话,垃圾回收将不起做用,须要本身写脚本

*      (2)session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值;这个值能够从php.ini找到,session.name = PHPSESSID //默认值PHPSESSID

*      (3)若是不存在会生成一个session_id,而后把生成的session_id做为COOKIE的值传递到客户端;至关于执行了下面COOKIE 操做,注意的是,这一步执行了setcookie()操做,COOKIE是在header头中发送的,

*         这以前是不能有输出的,PHP有另一个函数 session_regenerate_id() 若是使用这个函数,这以前也是不能有输出的

setcookie(

session_name(),//PHPSESSID,对应php.ini中session.name = PHPSESSID配置选项

session_id(),  //生成的session_id值

session.cookie_lifetime,//默认0

session.cookie_path,//默认'/'当前程序跟目录下都有效

session.cookie_domain,//默认为空

)

*      (4)若是存在session_id,那么session_id = $_COOKIE[session_name];而后去session.save_path指定的文件夹里去找名字为'SESS_'. session_id()的文件,读取文件的内容反序列化,而后放到$_SESSION中

*      (5)为$_SESSION赋值:

*         好比新添加一个值$_SESSION['test'] = 'blah';那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,会把$_SESSION的值写入到session_id指定的文件夹中,而后关闭相关资源

这个阶段有可能执行更改session_id的操做,好比销毁一个旧的的session_id,生成一个全新的session_id.

if (isset($_COOKIE[session_name()])) {//如:匿名用户有一个SESSION的,当它登陆后须要换用新的session_id

setcookie(session_name(), '', time() - 42000, '/');//旧session cookie过时

}

session_regenerate_id();//这一步会生成新的session_id,此时再经过session_id()返回的是新的值

*      (6)写入SESSION:在脚本结束的时候会执行SESSION写入操做,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,可能须要建立新的文件

*      (7)销毁SESSION:SESSION发出去的COOKIE通常属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过时,假如须要人为强制过时,好比 退出登陆,而不是关闭浏览器,那么就须要在代码里销毁SESSION,方法有不少:

setcookie(session_name(), session_id(), time() - 8000000, ..);//退出登陆前执行

usset($_SESSION);//这会删除全部的$_SESSION数据,刷新后,有COOKIE传过来,可是没有数据

session_destroy();//这个做用更完全,删除$_SESSION 删除session文件,和session_id

*

* 【session.save_handler = user】:用户自定义session处理机制

*      (1)用户自定义session处理机制:session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');//【执行此函数将修改session默认的存储介质;修改是隐式的,因此不会体如今php.ini配置文件中的session.save_handler配置项】

session_start():

执行open($save_path, $session_name)打开session操做句柄,$save_path 在session.save_handler = files的状况下它就是session.save_path;可是若是用户自定的话,这个两个参数都用不上,直接返回TRUE

执行read($id)从中读取数据.//【这个参数是自动传递的就是session_id()】,能够经过这个值进行操做

(2)脚本执行结束:执行write($id, $sess_data) //两个参数,很简单

(3)假如用户须要session_destroy(),先执行destroy.在执行第2步

(4)案例:

//SESSION初始化的时候调用

function open($save_path, $session_name){

global $sess_save_path;

$sess_save_path = $save_path;

return(true);

}

//关闭的时候调用

function close(){

return(true);

}

function read($id){//【参数会自动传递,就是session_id()】

global $sess_save_path;

$sess_file = "$sess_save_path/sess_$id";

return (string) @file_get_contents($sess_file);

}

//脚本执行结束以前,执行写入操做

function write($id, $sess_data){//【参数会自动传递,就是session_id()】

echo "sdfsf";

global $sess_save_path;

$sess_file = "$sess_save_path/sess_$id";

if ($fp = @fopen($sess_file, "w")) {

$return = fwrite($fp, $sess_data);

fclose($fp);

return $return;

} else {

return(false);

}

}

function destroy($id){//【参数会自动传递,就是session_id()】

global $sess_save_path;

$sess_file = "$sess_save_path/sess_$id";

return(@unlink($sess_file));

}

function gc($maxlifetime){

global $sess_save_path;

foreach (glob("$sess_save_path/sess_*") as $filename) {

if (filemtime($filename) + $maxlifetime 

@unlink($filename);

}

}

return true;

}

?>

*

*/

//【session.save_handler = user】:用户自定义session处理机制

$SESS_DBHOST = "127.0.0.1";

$SESS_DBNAME = "cms";

$SESS_DBUSER = "root";

$SESS_DBPASS = "";

$SESS_DBH = ""; //数据库链接句柄

$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");//默认:8M

//SESSION初始化的时候调用

function sess_open($save_path, $session_name) {

global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;

if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {

echo "

Can't connect to $SESS_DBHOST as $SESS_DBUSER";

echo "

MySQL Error: " . mysql_error();

die;

}

if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {

echo "

Unable to select database $SESS_DBNAME";

die;

}

return true;

}

//关闭的时候调用

function sess_close() {

return true;

}

function sess_read($key) {

global $SESS_DBH, $SESS_LIFE;

$qry = "SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " . time();

$qid = mysql_query($qry, $SESS_DBH);

if (list($value) = mysql_fetch_row($qid)) {

return $value;

}

return false;

}

//脚本执行结束以前,执行写入操做

function sess_write($key, $val) {   

global $SESS_DBH, $SESS_LIFE;

$expiry = time() + $SESS_LIFE; //过时时间

$value = addslashes($val);

$qry = "INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')";

$qid = mysql_query($qry, $SESS_DBH);

if (! $qid) {

$qry = "UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();

$qid = mysql_query($qry, $SESS_DBH);

}

return $qid;

}

function sess_destroy($key) {

global $SESS_DBH;

$qry = "DELETE FROM session_tbl WHERE sesskey = '$key'";

$qid = mysql_query($qry, $SESS_DBH);

return $qid;

}

function sess_gc($maxlifetime) {

global $SESS_DBH;

$qry = "DELETE FROM session_tbl WHERE expiry 

$qid = mysql_query($qry, $SESS_DBH);

return mysql_affected_rows($SESS_DBH);

}

//【session.save_handler = user】:用户自定义session处理机制主要是经过session_set_save_handler()来进行协调执行

//【执行此函数将修改session默认的存储介质;修改是隐式的,因此不会体如今php.ini配置文件中的session.save_handler配置项】

session_set_save_handler(

"sess_open",    //能够进行重写

"sess_close",   //能够进行重写

"sess_read",    //能够进行重写

"sess_write",   //能够进行重写

"sess_destroy", //能够进行重写

"sess_gc"       //能够进行重写

);

session_start();    //除了以上被重写的session函数外,其它的session函数仍是想之前同样调用

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值