记录于2014.06.02
------------------------------------------------------------------------------------------------
注:session是服务器段技术;注意一个会话对应一个session文件
① 对session进行操作时,需要进行session_start(); //即创建session文件
② Session文件中可以放入多个 key<==>val 对,注意key不能重复,val可以是基本数据类型,和array对象
③ 如果要取出对象时,则需要事先声明一下类的定义信息。
<?php
//删除session信息
//1.删除某一个key<==>val
session_start();
unset($_SESSION[‘name’]);
//2.删除所有的key<==>val
//这样就会把当前这个浏览器对应的session文件
session_destroy();
Echo “删除session 成功!”;
?>
思考:如果没有手动删除session,系统是怎么处理的
细节讨论:
1.session的最大生命周期1440 S(24min),这个时间是指在1440s内没有使用过session文件,该才会被当成垃圾呗回收,,可在php.ini中修改 session.gc_maxlifetime
2.Session文件存放路径 可以修改 php.ini session.save_path=”c:/ ”;修改后需重启apach
3.在使用session的时候,应当保证对session进行初始化。
方法1,在需要使用session页面都写入session_start();
方法2,在php.ini文件中,配置session.auto_start=1(不推荐,有些页面不需要,如登录界面)
4.服务器是怎样实现,一个session文件为一次会话服务的,原理是:
思考问题:
如果用户禁用cookie?
当用户禁用cookie后,服务器每次session_start() 都会 创建一个全新的session文件,后果就是无法让多个页面php,去共享一份session文件
如何解决?从cookie session 和http协议入手解决
请问如果客户端禁用cookie,怎样实现session技术共享多个界面?
答:
法一:在每个超链接上添加一个PHPSESSID=sessionId;
同时在每个页面加入
If(isset($_GET[‘’PHPSESSID])){
//设置session_id;
Session_id($_GET[‘’PHPSESSID]);
}
Session_start();
法二:使用常量SID
学习php的session部分时出现如下错误:
Warning : session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at F:\MyEnv\AppServ\www\session2.php:3) in F:\MyEnv\AppServ\www\session2.php on line 4
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at F:\MyEnv\AppServ\www\session2.php:3) in F:\MyEnv\AppServ\www\session2.php on line 4
谷歌得到解决方法:
关于session的问题集锦解决方案
1.
错误提示
Warning: Cannot send session cookie – headers already sent
Warning: Cannot send session cache limiter – headers already sent
分析及解决办法
这 一类问题,的原因是你在程序中使用session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或 print一条消息了。很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的 session_start()调到程序的第一行。
2.
//保存session
《?php
session_start();
echo "<br>**演示如何保存session数据***<br>";
//1.初始化session
//2.保存数据
$_SESSION['name']="shunping";
//session 文件中可以保存所有基本数据类型double,integer,bool,array,object
$_SESSION['age']=100;
$_SESSION['isBoy']=true;
$arr1=array("北京","小米","hello");
$_SESSION['arr1']=$arr1;
class Dog{
private $name;
private $age;
private $intro;
function __construct($name,$age,$intro){
$this->name=$name;
$this->age=$age;
$this->intro=$intro;
}
public function getName(){
return $this->name;
}
}
$dog1=new Dog("大狗",5,"很好的够");
$_SESSION['dog1']=$dog1;
echo "保存ok";
?》
//获取session
《?php
session_start();
echo "获取session数据<br>";
//获取session
//1.把所有的session 获取
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
echo "名字是:".$_SESSION["name"];
$arr1=$_SESSION['arr1'];
echo "<br>";
foreach($arr1 as $key=>$val){
echo "<br>--$val";
}
//红色部分加入后 正确
//3.取出对象
$xiaogou=$_SESSION['dog1'];
echo "<br>小狗的名字是:".$xiaogou->getName();
?》
错误提示
Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Dog" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in F:\MyEnv\AppServ\www\session2.php on line 22
分析及解决方法
如果要取出对象时,则需要事先声明一下类的定义信息。例如在上述代码中,方法1.将class Dog 再次定义到获取session的php文件中;方法2,将class Dog 封装成一个类文件,需要获取时require_once ‘Dog.class.php’。
3.
错误提示
Warning: open(F:/689\php\sessiondata\sess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed
分析及解决方法
出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_path和session.cookie_path 设置置为
session_save_path = c:\temp
session.cookie_path = c:\temp
然后在c:\目录下建立一个temp目录,即可
3.
错误提示
Warning: Trying to destroy uninitialized session in
分析及解决方法
出 类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的运 行,其实不然。解决的方法是在你调session_destroy()函数之前,要用session_start()开启session的功能。
4.问题:怎么获得当前session的id值呢?
最简单的方法是:
echo "<br>session_id是:".session_id();
你会发现的。
5.问题:我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php 文件中也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘 故呢?
答:或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任 何的输出!但是你是否用光标键在?>这个PHP代码结束语句后移动检查呢?那么你会发现在?>这个后面,有一个空行或几个空格,你删除了这几 个空行或空格,那么问题就解决了。
注:此问题,会出PHP4.1.2中,更高版本,没有测试过。
6.问:用session做登录主页面后,其它页面怎么用session限制登录。。。
答:最简单的方法是
session_start();
if(!session_registered('login') ││ $login != true) {
echo "你没有登陆";
exit;
}
7.问:我用session_register()注册了session变量,可是当我用header或用javascript的重定向语句,那么在一下页面中,我却访问不到session所注册的变量值。请问如何解决?
问题的程序片段:
《?
session_start();
$ok = 'love you';
session_register('ok');
header("location : next.php");
?》
next.php
《?
session_start();
echo $ok;
?》
解决的方法:
当你用header函数或window.location这样的功能后,你上一个页面所注册的session变量,就会容易的丢失,关于这个问题的原因,至今仍没有一个详细的回答。
不过有解决的方法。如下所示 www.2cto.com
header("Location: next.php" ."?" . SID);
在跳转到下一页面的时候,将session的当前id做为一个参数,传到后一个页面。
8.session如何传数组
session_register('data');
$data=array(1,2,3,4);
方法是先注册后赋值
9.问题9:我是不是可以用像$HTTP_GET_VARS['**']方式来访问session值呢?
回答:可以,你可以使用如下global数组来访问session,以加强网页的安全性
$HTTP_SESSION_VARS
$_SESSION
例程:
《?php
session_start();
$username = 'stangly.wrong';
session_register('username');
echo $HTTP_SESSION_VARS['username'];
echo '<br>';
echo $_SESSION['username'];
?》
请参照此例程修改符合您自己的程序。
问题10:session_unregister() 和 session_destroy() 有何区别?
session_unregister() 函数主要作用是注消当前的一个session变量。不过要注意的是,如果你用$HTTP_SESSION_VARS或$_SESSION在当前页面中引用 过session变量,那么你可能需要和unset()配合 来注消session变量。
而session_destroy()是清除当前的 session环境。意思就是说,当你用session_destroy()函数后,那么你就不可能再用session_is_registered() 来检测session的变量了。但是需要注意的是他不能清除global中的session或使用了session cookie的中的session.所以在用session_destroy之前,最好不要用$HTTP_SESSION_VARS $_SESSION来访问session.(译自于php.net)
例程:
if(isset($_COOKIE[session_name()])) {
session_start();
session_destroy();