您的位置:首页 > 编程语言 > PHP开发

php设置session有效期

2012-03-09 16:19 162 查看
<?php

session_start();

// 这种方法是将原来注册的某个变量销毁

unset($_SESSION["admin"]);

// 这种方法是销毁整个 Session 文件

session_destroy();



手动设置 Session 的生存期:

<?php

session_start();

// 保存一天

$lifeTime = 24 * 3600;

setcookie(session_name(), session_id(), time() + $lifeTime, "/");

?>

  其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:

<?php

// 保存一天

$lifeTime = 24 * 3600;

session_set_cookie_params($lifeTime);

session_start();

$_SESSION["admin"] = true;

?>

如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。

假设客户端禁用 Cookie 怎么办?没办法,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册 Session。那么怎么传递 Session ID 呢?通过 URL 或者通过隐藏表单来传递,PHP 会自动将 Session ID 发送到 URL 上,URL 形如:http://www.openphp.cn/index.php?PHPSESSID=bba5b2a240a77e5b44cfa01d49cf9669,其中 URL 中的参数 PHPSESSID 就是 Session ID了,我们可以使用
$_GET 来获取该值,从而实现 Session ID 页面间传递。

<?php

// 保存一天

$lifeTime = 24 * 3600;

// 取得当前 Session 名,默认为 PHPSESSID

$sessionName = session_name();

// 取得 Session ID

$sessionID = $_GET[$sessionName];

// 使用 session_id() 设置获得的 Session ID

session_id($sessionID);

session_set_cookie_params($lifeTime);

session_start();

$_SESSION["admin"] = true;

?>

  对于虚拟主机来说,如果所有用户的 Session 都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,我们可以手动设置 Session 文件的保存路径,session_save_path()就提供了这样一个功能。我们可以将 Session 存放目录指向一个不能通过 Web 方式访问的文件夹,当然,该文件夹必须具备可读写属性。

<?php

// 设置一个存放目录

$savePath = "./session_save_dir/";

// 保存一天

$lifeTime = 24 * 3600;

session_save_path($savePath);

session_set_cookie_params($lifeTime);

session_start();

$_SESSION["admin"] = true;

?>

  同 session_set_cookie_params(); 函数一样,session_save_path() 函数也必须在 session_start() 函数调用之前调用。

  我们还可以将数组,对象存储在 Session 中。操作数组和操作一般变量没有什么区别,而保存对象的话,PHP 会自动对对象进行序列化(也叫串行化),然后保存于 Session 中。下面例子说明了这一点:

<?php

class person

{

var $age;

function output() {

echo $this->age;

}

function setAge($age) {

$this->age = $age;

}

}

?>

setage.php

<?php

session_start();

require_once "person.php";

$person = new person();

$person->setAge(21);

$_SESSION['person'] = $person;

echo "<a href='output'>check here to output age</a>";

?>

output.php

<?

// 设置回调函数,确保重新构建对象。

ini_set('unserialize_callback_func', 'mycallback');

function mycallback($classname) {

$classname . ".php";

}

session_start();

$person = $_SESSION["person"];

// 输出 21

$person->output();

?>

  当我们执行 setage.php 文件的时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 Session 中(PHP 将自动完成这一转换),当转到 output.php 后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以我们定义了以后回调函数,自动包含 person.php 这个类文件,因此对象被重构,并取得当前 age 的值为 21,然后调用 output() 方法输出该值。

  另外,我们还可以使用 session_set_save_handler 函数来自定义 Session 的调用方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: