php中session_unset与session_destroy的用法与区别

 更新时间:2016年11月25日 15:50  点击:1590
本文章来介绍了关于session_unset与session_destroy函数他们之间的区别以及在删除变量时的一些不同的地方法。

session_unset()

释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的session id

 代码如下 复制代码
<?php
    session_start();
    session_unset();
    session_destroy();
    session_write_close();
    setcookie(session_name(),'',0,'/');
    session_regenerate_id(true);
?>

session_destroy()

删除当前用户对应的session文件以及释放session id,内存中的$_SESSION变量内容依然保留
因此,释放用户的session所有资源,需要顺序执行如下代码:

 代码如下 复制代码

<?php
$_SESSION['user'] = ‘user1′;
session_unset();
session_destroy();
?>

 删除session方法:

1、unset ($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用,可将之打入冷宫。

  unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_session变量。

2、$_SESSION=array() 删除多个session

3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。

总结:

session_destroy是注销所有的session变量,并且结束session会话;
session_unset()并不注销session变量,但把所有的session变量的值清空.

本文章来告诉你如何在php5中的php.ini中配置session的详细教程,包括了路径等等一些相关的操作,有需要了解的同学可参考一下。

在您把用户信息存储到 PHP session 中之前,首先必须启动会话。

注释:session_start() 函数必须位于 <html> 标签之前:

 代码如下 复制代码

 
<?php session_start(); ?>

<html>
<body>

</body>
</html>上

 

面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
存储 Session 变量
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:

 

 代码如下 复制代码

<?php
session_start();
// store session data
$_SESSION['views']=1;
?>

<html>
<body>

<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>

</body>
</html>

 

输出:

Pageviews=1在下面的例子中,我们创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则我们创建 "views" 变量,并把它设置为 1:

 

 代码如下 复制代码

<?php
session_start();

if(isset($_SESSION['views']))
  $_SESSION['views']=$_SESSION['views']+1;

else
  $_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>

 


Php处理会话的函数一共有11个,我们详细介绍一下将要用到几个函数。

1、 session_start

函数功能:开始一个会话或者返回已经存在的会话。

函数原型:boolean session_start(void);

返回值:布尔值

功能说明:这个函数没有参数,且返回值均为true。最好将这个函数置于最先,而且在它之前不能有任何输出,否则会报警,如:Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2) in /usr/local/apache/htdocs/cga/member/1.php on line 3

2、 session_register

函数功能:登记一个新的变量为会话变量

函数原型:boolean session_register(string name);

返回值:布尔值。

功能说明:这个函数是在全局变量中增加一个变量到当前的SESSION中,参数name就是想要加入的变量名,成功则返回逻辑值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。

3、 session_is_registered

函数功能:检查变量是否被登记为会话变量。

函数原型:boobean session_is_registered(string name);

返回值:布尔值

功能说明:这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。成功则返回逻辑值true。

4、 session_unregister

函数功能:删除已注册的变量。

函数原型:boolean session_session_unregister(string name);

返回值:布尔值

功能说明:这个函数在当前的session之中删除全局变量中的变量。参数name就是欲删除的变量名,成功则返回true.

5、 Session_destroy

函数功能:结束当前的会话,并清空会话中的所有资源。

函数原型:boolean session destroy(void);

返回值:布尔值。

功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true

上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:

6、 session_encode

函数功能:sesssion信息编码

函数原型:string session_encode(void);

返回值:字符串

功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。

7、 session_decode

函数功能:sesssion信息解码

函数原型:boolean session_decode (string data)

返回值:布尔值

功能说明:这个函数可将session信息解码,成功则返回逻辑值true

8、 session_name

函数功能:存取当前会话名称

函数原型:boolean session_name(string [name]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name

9、 session_id

函数功能:存取当前会话标识号

函数原型:boolean session_id(string [id]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id

10、 session_unset

函数功能:删除所有已注册的变量。

函数原型:void session_unset (void)

返回值:布尔值

功能说明:这个函数和Session_destroy不同,它不结束会话。就如同用函数session_unregister逐一注销掉所有的会话变量


SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据  1.SESSION信息保存在哪?                                                                                   

 代码如下 复制代码
<?php
    session_start();
    $_SESSION['name']='marcofly';
?>

session默认是保存到c:windows emp目录下,但是通过修改php.ini中的session.save_path值可以改变session的保存路径。

如:session.save_path = "d:/wamp/tmp"


--------------------------------------------------------------------------------

执行该代码后,就会在d:/wamp/tmp目录下,新增一个文件名为:sess_***的文件,打开之后,内容如下:name|s:8:"marcofly";

文件内容解释:

name:key

s:保存类型是字符串

8:字符串长度

marcofly:value

SESSION能够保存什么类型的数据呢?                                                                   

如前一个例子所示,session能保存字符串,不仅如此,session还能保存整型(int),布尔型(bool),数组(array),而且,session还能保存对象

我们通过一个例子来简单的看下:

 

 代码如下 复制代码

 
<?php
    session_start();
    $_SESSION['name']='marcofly';//字符串
    $_SESSION['int']='10';//整型
    $_SESSION['bool']=True;//布尔型
    $_SESSION['array']=array('name'=>'marcofly','age'=>'23');//数组
    class test{
        public $msg;
        public function __construct(){
            $this->msg="Hello World";
        }
    }
    $obj=new test();
    $_SESSION['obj']=$obj;//对象
?>
 

结果如下:

name|s:8:"marcofly";

int|s:2:"10";

bool|b:1;

array|a:2:{s:4:"name";s:8:"marcofly";s:3:"age";s:2:"23";}

obj|O:4:"test":1:{s:3:"msg";s:11:"Hello World";}

关于session的用法我以前有讲述过很多,大家可以仔细的看看哈。

session的垃圾回收机制
session.gc_maxlifetime

session.gc_probability 

session.gc_divisor

session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。

比如:session.gc_maxlifetime=30,session.gc_divisor=1000,session.gc_probability=1,就表示每一千个用户调用session_start()的时候,就百分百的会执行一次垃圾回收机制,将磁盘上没用的session文件删除。

注意:一般对于一些大型的门户网站,建议将session.gc_divisor调大一点,减少开销

接下来,我通过一个例子演示下,如何配置才能让调用gc(垃圾回收)进程呢!

通过配置php.ini文件,修改以下几个信息:

session.gc_maxlifetime = 60//当session文件在60s后还没有被访问的话,则该session文件将会被视为“垃圾文件”,并且等待gc(垃圾回收)进程的调用的时候被清理掉
session.gc_probability = 1000
因为gc进程被调用的概率是通过gc_probability/gc_divisor 计算得来的,这里我将session.gc_probability改成1000,而session.gc_divisor 默认情况下也是1000。则gc进程在每次执行session_start()函数的时候都会被调用到。

以下我通过截图简单的说明下:

我开启三个会话,则创建三个对应的session文件,当每个文件在30秒内都没被调用的话,就会被当成是“垃圾文件”,等到gc进程调用的时候,“垃圾文件”就会被unlink,因为之前我已经通过修改php.ini配置文件,将gc被调用的概率改成百分百,所以接下来,如果我重新使用任何一个浏览器刷新下页面的时候,三个session文件,应该只剩下一个了


 

本文章来告诉你在php中如何实现文件的下载功能,地面要了解的朋友可以参考一下下哈。

客户端从服务端下载文件的流程分析:

浏览器发送一个请求,请求访问服务器中的某个网页(如:down.php),该网页的代码如下。
服务器接受到该请求以后,马上运行该down.php文件
运行该文件的时候,必然要把将要被下载的文件读入内存当中(这里是圣诞狂欢.jpg这张图片),这里通过fopen()函数完成该动作

代码:
 

 代码如下 复制代码
<?php
     header("Content-type:text/html;charset=utf-8");
 //    $file_name="cookie.jpg";
     $file_name="圣诞狂欢.jpg";
     //用以解决中文不能显示出来的问题
     $file_name=iconv("utf-8","gb2312",$file_name);
     $file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/";
     $file_path=$file_sub_path.$file_name;
     //首先要判断给定的文件存在与否
     if(!file_exists($file_path)){
         echo "没有该文件文件";
         return ;
     }
     $fp=fopen($file_path,"r");
     $file_size=filesize($file_path);
     //下载文件需要用到的头
     Header("Content-type: application/octet-stream");
     Header("Accept-Ranges: bytes");
     Header("Accept-Length:".$file_size);
     Header("Content-Disposition: attachment; filename=".$file_name);
     $buffer=1024;
     $file_count=0;
     //向浏览器返回数据
     while(!feof($fp) && $file_count<$file_size){
         $file_con=fread($fp,$buffer);
         $file_count+=$buffer;
         echo $file_con;
     }
 fclose($fp);
 ?>

header("Content-type:text/html;charset=utf-8")的作用:在服务器响应浏览器的请求时,告诉浏览器以编码格式为UTF-8的编码显示该内容
关于file_exists()函数不支持中文路径的问题:因为php函数比较早,不支持中文,所以如果被下载的文件名是中文的话,需要对其进行字符编码转换,否则file_exists()函数不能识别,可以使用iconv()函数进行编码转换
 $file_sub_path() 我使用的是绝对路径,执行效率要比相对路径高
Header("Content-type: application/octet-stream")的作用:通过这句代码客户端浏览器就能知道服务端返回的文件形式
Header("Accept-Ranges: bytes")的作用:告诉客户端浏览器返回的文件大小是按照字节进行计算的
Header("Accept-Length:".$file_size)的作用:告诉浏览器返回的文件大小
Header("Content-Disposition: attachment; filename=".$file_name)的作用:告诉浏览器返回的文件的名称
以上四个Header()是必需的
fclose($fp)可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区

注意:任何有关从服务器下载的文件操作,必然需要先在服务端将文件读入内存当中

现在文件已经在内存当中了,这是需要从内存当中读取文件,通过fread()函数完成该动作
需要注意的是,如果文件较大,文件应该是被分成多段返回给客户端的,并不是等文件在服务端全部读取完毕后,一次性返回给客户端,因为这样子会增加服务器的负荷。

本文章介绍了关于php通过调用腾讯的API接口返回所有在城市名称有需要了的朋友可参考一下。
 代码如下 复制代码
<?php  
/*
调用腾讯的API接口
返回结果 var IPData = new Array("114.238.55.147","","江苏省","淮安市");
0 为 IP地址
1 为 null
2 为 省份
3 为 城市
*/
function get_ip_place(){  
  $ip=file_get_contents("http://fw.qq.com/ipaddress"); 
  $ip=str_replace('"',' ',$ip);  
  $ip2=explode("(",$ip);  
  $a=substr($ip2[1],0,-2);  
  $b=explode(",",$a);  
  return $b;  
}  
$ip=get_ip_place();  
print_r($ip);  
print_r($ip[0]); // 这个就是你当前外网IP地址
print_r($ip[2]); // 这个就是你所在的省份
print_r($ip[3]); //这个就是你所在的城市了
?>
在php中用三种数组分别是数值数组,关联数组,多维数组那么它们三种的用法有一点不同,下面我们来看看吧。

 


数值数组
数值数组存储的每个元素都带有一个数字 ID 键。

可以使用不同的方法来创建数值数组:

例子 1
在这个例子中,会自动分配 ID 键:

 代码如下 复制代码

$names = array("Peter","Quagmire","Joe");

例子 2
在这个例子中,我们人工分配的 ID 键:

 代码如下 复制代码

$names[0] = "Peter";
$names[1] = "Quagmire";
$names[2] = "Joe";可以在脚本中使用这些 ID 键:

<?php

$names[0] = "Peter";
$names[1] = "Quagmire";
$names[2] = "Joe";

echo $names[1] . " and " . $names[2] . " are ". $names[0] . "'s neighbors";
?>

数组排序

(1)sort(array $array[,int sorttype])
 array 表示一个数组
 <TABLE class=dataintable><TBODY><TR><TD>      sorttype 取值:</TD><TD><P>           SORT_REGULAR - 默认。以它们原来的类型进行处理(不改变类型)。 </P><P>           SORT_NUMERIC - 把值作为数字来处理 </P><P>           SORT_STRING - 把值作为字符串来处理 </P><P>            SORT_LOCALE_STRING - 把值作为字符串来处理,基于本地设置<SUP style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif">*</SUP>。 </P></TD></TR></TBODY></TABLE>
 (2)bool rsort(array $array[,sorttype])函数    逆向排序(值逆向)
 sorttype  同上
 (3)bool shuffle()函数    随机排序
 (4)array array_reverse (array $array[,bool preserve_keys])  反向排列
 preserve_keys 为true时 保留原来的键名
 (5)array array_merge()合并数组
 (6)array array_slice(array $array,int offset[,int length[,boolpreserve_keys ])
 offset非负,这array中的偏移变量从此开始,为负时从末端开始
 length为正时,则表示序列中有很多单元,为负时表示从末端开始第几个数处结束,若省略则从offset开始一直到最后
 boolpreserve_keys  同上

数组循环输出

 代码如下 复制代码
<PRE class="brush:php; toolbar: true; auto-links: true;"><pre>
<?php
$shuzu=array('a'=>"wo",'b'=>"ni",'c'=>"ta",'d'=>"php",'e'=>"mysql");
echo "使用foreach函数遍历数组";
echo "<br/>$nbsp;<br/>";
foreach($shuzu as $key=>$value)
{
echo "$key 代表: $value";
echo "<br/>$nbsp;<br/>";
}
?>
</pre></PRE>

 

关联数组

关联数组,它的每个 ID 键都关联一个值。
在存储有关具体命名的值的数据时,使用数值数组不是最好的做法。
通过关联数组,我们可以把值作为键,并向它们赋值。
例子 1
在本例中,我们使用一个数组把年龄分配给不同的人:

 代码如下 复制代码
$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34);

例子 2
本例与例子 1 相同,不过展示了另一种创建数组的方法:

 代码如下 复制代码

$ages['Peter'] = "32";
$ages['Quagmire'] = "30";
$ages['Joe'] = "34";可以在脚本中使用 ID 键:
<?php

$ages['Peter'] = "32";
$ages['Quagmire'] = "30";
$ages['Joe'] = "34";

echo "Peter is " . $ages['Peter'] . " years old.";
?>以上脚本的输出:
Peter is 32 years old.


关联数组判断为空的代码,然后我们详细讲讲关于数据空的处理。

 代码如下 复制代码
<?php教程
    $array = array(0);
    if(empty($array)){
        echo "我空了n";
    }else{
        echo "我不空啊n";
    }
    $array['array']='我是数组';
    print_r($array);
    $array['array1']='我是数组1';
    print_r($array);
    unset($array['array1']);
    print_r($array);
?>

更多详细内容请查看:http://www.111cn.net/phper/php/39841.htm

遍历

遍历用户列表的时候,只需直接用 isset 查询那个用户名是否存在即可。

PHP 版代码:

 代码如下 复制代码

<?php
$arrayHash = array();
foreach($arrayN as $nameN) {
   // 本行执行了 N 次。
   $arrayHash[$nameN] = 1;
}
 

foreach($arrayM as $keyM => $nameM) {
   if (isset($arrayHash[$nameM])) {
   // 本行执行了 M 次!
   unset($arrayM[$keyM]);
   }
}
return $arrayM;
?>

多维

数组

在多维数组中,主数组中的每个元素也是一个数组。在子数组中的每个元素也可以是数组,以此类推。
例子 1
在本例中,我们创建了一个带有自动分配的 ID 键的多维数组:

 代码如下 复制代码
$families = array
(
  "Griffin"=>array
  (
  "Peter",
  "Lois",
  "Megan"
  ),
  "Quagmire"=>array
  (
  "Glenn"
  ),
  "Brown"=>array
  (
  "Cleveland",
  "Loretta",
  "Junior"
  )
);如果输出这个数组的话,应该类似这样:
Array
(
[Griffin] => Array
  (
  [0] => Peter
  [1] => Lois
  [2] => Megan
  )
[Quagmire] => Array
  (
  [0] => Glenn
  )
[Brown] => Array
  (
  [0] => Cleveland
  [1] => Loretta
  [2] => Junior
  )
)

例子 2
让我们试着显示上面的数组中的一个单一的值:

 代码如下 复制代码
echo "Is " . $families['Griffin'][2] .
" a part of the Griffin family?"; 以上代码的输出:
Is Megan a part of the Griffin family?


数组排序

 代码如下 复制代码

<?php
$array[] = array("age"=>20,"name"=>"li");
$array[] = array("age"=>21,"name"=>"ai");
$array[] = array("age"=>20,"name"=>"ci");
$array[] = array("age"=>22,"name"=>"di");
 
foreach ($array as $key=>$value){
 $age[$key] = $value['age'];
 $name[$key] = $value['name'];
}
 
array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array);
print_r($array);
?>

更多array_multisort()可参考http://www.111cn.net/phper/php/42696.htm

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 谈谈Jquery中的children find 的区别有哪些

    精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21
  • 详解C#中的session用法

    这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Python3使用Selenium获取session和token方法详解

    这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17
  • iscroll.js 用法介绍

    最新版下载: http://www.csdn123.com/uploadfile/2015/0428/20150428062734485.zip 概要 iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生...2016-05-19
  • PS中像素大小、文档大小的区别

    在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C#中的try catch finally用法分析

    这篇文章主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#中sleep和wait的区别分析

    这篇文章主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • 示例详解react中useState的用法

    useState 通过在函数组件里调用它来给组件添加一些内部 state,React 会在重复渲染时保留这个 state,接下来通过一个示例来看看怎么使用 useState吧...2021-06-04
  • 编程新手必须掌握的:session与cookie的区别

    session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
  • PHP中如何使用session实现保存用户登录信息

    session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
  • uniapp和vue的区别详解

    这篇文章主要介绍了uniapp和vue的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-10-19
  • PHP中print_r、var_export、var_dump用法介绍

    文章详细的介绍了关于PHP中print_r、var_export、var_dump区别比较以及这几个在php不同的应用中的用法,有需要的朋友可以参考一下 可以看出print_r跟var_export都...2016-11-25
  • php中php://input的用法详细

    在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input。 下面的例子摘取的是wordpres...2016-11-25