Bootstrap

使用$_SESSION设置和读取Session (PHP)

Session的中文是会话的意思,在Web编程中Session代表服务器与客户端之间的“会话”,意思是服务器与客户端在不断的交流。
在PHP中,使用$_SESSION[]可以存储特定用户的Session信息。并且每个用户的Session信息都是不同的。
当用户请求网站中任意一个页面时,若用户未建立Session对象,则服务器会自动为用户创建一个Session对象,它包含唯一的SessionID和其他Session变量,并保存在服务器内存中,不同用户的Session对象存着各自指定的信息。

Session信息的存储与读取

session_start(); //开启Session功能
session_id();//获取用户Session ID值,如需修改在括号中传值即可

利用Session变量存储信息:
$_SESSION["Session名称"]=变量或字符串信息;

读取Session变量信息(可赋值给一个变量或者直接输出):
变量=$_SESSION["Session名称"];

说明:
(1)使用Session前都需要在页面开头用session_start()方法开启Session功能。
(2)session_start()函数前不能有任何代码输出到浏览器,最好加在页面头部,或者先用ob_start()函数打开输出缓冲区。
(3)对于一个不存在的Session变量赋值,将自动创建该变量;给一个已经存在的Session变量赋值,将修改其中的值。
(4)如果新打开一个浏览器,则无法获取之前保存的Session信息。因为新打开一个浏览器相当于一个新的用户在访问。
(5)只要创建了Session变量,该Session变量就能被网站中所有页面访问。
(6)最好不要把大量的信息存入Session变量中,或者创建很大Session变量。如果Session变量保存的信息太多,同时访问网站的用户又很多会非常占用服务器资源。

演示代码:

//test1.php
<?php
	session_start();
	$_SESSION['name']="admin";
	$_SESSION['password']=123456;
	echo "所在文件:".$_SERVER["PHP_SELF"]."<br/>";
	echo "用户名:{$_SESSION['name']} <br/>密码:{$_SESSION['password']}";
?>
//test2.php
<?php
	session_start();
	echo "所在文件:".$_SERVER["PHP_SELF"]."<br/>";
	echo "用户名:{$_SESSION['name']} <br/>密码:{$_SESSION['password']}";
?>

运行截图

Session的生命期

Session对象的生命期指的是从用户在Session有效期内第一次访问网站直到不再访问网站为止的这段时间。

设置Session有效期:
ini_set('session_save_path','/tmp/');//设置保存路径
ini_set('session.gc_maxlifetime',60);//保存1分钟
setcookie(session_name(),session_id(),time()+6,"/");//设置会话cookie的过期时间
 
说明:
(1)关闭浏览器不会使一个Session结束,但会使这个Session永远无法访问。因为当用户打开新的浏览器窗口又会产生一个新的Session。
(2)Session对象不是一直有效,默认有效期为24分钟。
(3)增加Session的有效期会导致Web服务器保存用户Session的信息的时间增长,如果访问的用户很多,会加重服务器负担。
(4)不能单独对某个用户的Session设置有效期。

删除和销毁Session
删除Session常用来实现用户注销的功能,使得用户能够安全退出网站。
 
session_unset();//删除$_SESSION中所有session变量
session_destroy();//清除Session ID

说明:
(1)session_unset函数只能删除$_SESSION[]中的所有元素,不能删除对应的Session ID,也不能删除保存Session ID的文件。
(2)session_destroy函数只能删除Session ID,并销毁Session文件,但是不能删除$_SESSION[]中的所有元素。
(3)unset()方法也可以删除单个Session变量。

利用Session限制未登入用户访问(演示代码)

//login.php
<html>
	<head>
		<title>登入</title>
	</head>
	<body>
		<?php
			session_start();
			if(!isset($_POST["login"])){
				echo '
				<form action="#" method="post">
					<p>帐号:<input type="text" name="name"/></p>
					<p>密码:<input type="password" name="pw"/></p>
					<p><input type="submit" name="login" value="登入"/>
				</form> ';
			}
			else{
				$name=$_POST["name"];
				$pw=$_POST["pw"];
				if($name=="admin"&&$pw==123456)
				{
					$_SESSION["name"]=$name;
					$_SESSION["pw"]=$pw;
					echo '登入成功,<a href="test.php">查看个人信息</a>';
				}
				else{
					echo '帐号或密码错误!<a href="JavaScript:history.back()">返回登入</a>';
				}
			}
		?>
	</body>
</html>

//test.php
<?php
	session_start();
	if(isset($_SESSION['name'])){
		echo "帐户信息:<br/>";
		echo "用户名:".$_SESSION["name"]."<br/>";
		echo "密码:".$_SESSION["pw"]."<br/>";
		echo '<a href="logout.php?action=logout">注销</a>';
	}else{
		echo '未登入用户不允许访问,<a href="login.php">请登入</a>';
	}
?>

//logout.php
<?php
	if($_GET['action']=="logout"){
		header('Refresh:3; url="login.php"');
		session_start();
		setcookie("cookiename", NULL);
		session_unset();
		session_destroy();
		echo "三秒后返回登入页面";
	}
?>

运行截图

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;