- 启动 Session 会话,并创建一个 $admin 变量:
-
-
-
- <?php
-
- session_start();
-
- $_SESSION["admin"] = null;
- ?>
- 如果你使用了 Seesion,或者该 PHP 文件要调用 Session 变量,那么就必须在调用 Session 之前启动它,使用 session_start() 函数。其它都不需要你设置了,PHP 自动完成 Session 文件的创建。
-
- 执行完这个程序后,我们可以到系统临时文件夹找到这个 Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:
-
- admin|N; 一般该内容是这样的结构:
-
- 变量名|类型:长度:值; 并用分号隔开每个变量。有些是可以省略的,比如长度和类型。
-
- 我们来看一下验证程序,假设数据库存储的是用户名和 md5 加密后的密码:
-
- login.php
- <?php
-
- $posts = $_POST;
-
- foreach ($posts as $key => $value) {
- $posts[$key] = trim($value);
- }
- $password = md5($posts["password"]);
- $username = $posts["username"];
-
- $query = "SELECT `username` FROM `user` WHERE `password` = '$password' AND `username` = '$username'";
-
- $userInfo = $DB->getRow($query);
-
- if (!empty($userInfo)) {
-
- session_start();
-
- $_SESSION["admin"] = true;
- } else {
- die("用户名密码错误");
- }
- ?>
- 我们在需要用户验证的页面启动 Session,判断是否登陆:
-
- <?php
-
- $admin = false;
-
- session_start();
-
- if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) {
- echo "您已经成功登陆";
- } else {
-
- $_SESSION["admin"] = false;
- die("您无权访问");
- }
- ?>
- 是不是很简单呢?将 $_SESSION 看成是存储在服务器端的数组即可,我们注册的每一个变量都是数组的键,跟使用数组没有什么分别。
-
- 如果要登出系统怎么办?销毁 Session 即可。
-
- <?php
- session_start();
-
- unset($_SESSION['admin']);
-
- session_destroy();
- ?>
- Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 Session 才是最方便的。
-
- Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 Session ID。
-
- 如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 Session 生存期的角色。
-
- 我们来手动设置 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:
-
- <?php
-
- $lifeTime = 24 * 3600;
-
- $sessionName = session_name();
-
- $sessionID = $_GET[$sessionName];
-
- 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 中。下面例子说明了这一点:
-
- person.php
- <?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.php'>check here to output age</a>';
- ?>
- output.php
- <?php
-
- ini_set('unserialize_callback_func', 'mycallback');
- function mycallback($classname) {
- include_once $classname . '.php';
- }
- session_start();
- $person = $_SESSION['person'];
-
- $person->output();
- ?>
- 当我们执行 setage.php 文件的时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 Session 中(PHP 将自动完成这一转换),当转到 output.php 后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以我们定义了以后回调函数,自动包含 person.php 这个类文件,因此对象被重构,并取得当前 age 的值为 21,然后调用 output() 方法输出该值。
- session_start();
- $i=session_id();
- $ii=$_COOKIE['PHPSESSID'];
-
- 另外,我们还可以使用 session_set_save_handler 函数来自定义 Session 的调用方式。
-
- COOKIE操作
- setcookie('key','value');
-
- echo $_COOKIE['key'];
文章出处:http://dcdc723.javaeye.com/blog/580604 |