极品分享

PHP的session会话基本使用

 PHP会话机制---session的基本使用


1、思考:登录网站后,在每个网页都能拿到用户信息

(1) 使用超链接传递用户名,这样太繁琐了,不建议使用 。

(2) 使用数据库,每打开一个页面都查询一次用户信息表,这样网页加载速度变慢,用户体验变差。

(3) 使用cookie,登录成功后,服务器将用户信息存储到客户端的cookie。这样存在缺点:

      ① 安全性差,将用户信息存储在本地,很容易被别人找到。 

      ② 服务器每次打开一个网页,都通过网络从客户机读取用户信息,这样浪费带宽,当用户很多,每个用户打开很多网页,会浪费巨大的带宽。

(4) 解决之道:session


2、session技术

      Session是服务器端技术,利用这个技术,服务器可以为每个用户的浏览器创建一个为其独享的session文件,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务。 


3、保存session信息

index1.php

<?php
session_start(); // 初始化session
$_SESSION['name'] = "zhangsan"; //保存某个session信息

index2.php

<?php
session_start();
echo $_SESSION['name'];

先在网页中运行index1.php,再运行index2.php页面输出:

527602-20160927164512656-711284124.png


4、session可以保存多种数据类型

session不但保存字符串,还可以保存整型,布尔型,数组,对象等。

index1.php

<?php
session_start(); // 初始化session
$_SESSION['name'] = "zhangsan"; //保存某个session信息
$_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;
    }
}
 
$dog1 = new Dog("大黄",2,"很听话");
$_SESSION['dog1'] = $dog1;


index2.php

<?php
session_start();
foreach($_SESSION as $key=>$value){
    echo $key.":";
    var_dump($value);
    echo "<br/>";
}


先在网页中运行index1.php,再运行index2.php页面输出:

527602-20160927164844735-530897279.png

527602-20160927165530578-1895480954.png


 

5、获取session信息

(1)直接获取所有session

<?php
session_start();
var_dump($_SESSION);

(2)根据key获取

a)直接获取某个变量

<?php
session_start();
echo $_SESSION['name'].'<br/>';
echo $_SESSION['age'].'<br/>';

b)获取数组

<?php
session_start();
foreach($_SESSION['arr1'] as $key=>$value)
{
  echo $key.':'.$value.'<br/>';
}

c)获取对象,session在保存对象时候,没法保存类的信息,因此在获取对象,需要先声明这个类。可以把类单独作为一个文件,存储和读取session时候分别引用这个文件。

<?php
require_once "dog.class.php";
session_start();
$dog = $_SESSION['dog1'];
echo $dog->getName().'<br/>';
echo $dog->getAge().'<br/>';
echo $dog->getIntro().'<br/>';

6、Session的更新,就是根据key值重新保存session的值。【即:重复赋值进行覆盖】

<?php
session_start();
$_SESSION['name'] = 'ZhangSan';
echo $_SESSION['name'].'<br/>';
$_SESSION['name'] = 'LiSi';
echo $_SESSION['name'].'<br/>';


7、Session的删除

(1) 指定删除session中某个键值对

<?php
session_start();
unset($_SESSION['name']);


(2) 删除所有session

<?php
session_start();
session_destroy();


8、Session数据默认存在时间是1440s(24分钟),可以在php.ini中修改, session.gc_maxlifetime = 1440。Session文件的存放路径是可以修改的,可以通过修改php.ini改变sesion文件存放路径,session.save_path = "tcp://127.0.0.1:11211"。


9、Session使用前,先进行初始化,session_start();这样比较麻烦,可以在php.ini设置session自动初始化,session.auto_start = 0(此方法不推荐)。


10、浏览器访问页面a.php时候,服务器产生一个session文件,将其存放在服务器,同时将session_id发送给浏览器,浏览器将其保存到cookie,浏览器再次访问b.php时候,从cookie中获取session_id发送到服务器,服务器根据session_id获取相应session内容。


问题:如果浏览器禁用cookie,怎么使用session呢?


使用URL重写的方式,url重写分为手动和自动。自动重写url就是配置php.ini,开启透明的SID,其他程序不变,自动重写url不安全,不建议使用。

开启透明SID,需要修改的php.ini是:

session.use_trans_sid = 1         //由0改为1

session.use_only_cookies = 0  //是否只使用cookie来保存session值  该参数为1时,上述机制失效。

session.use_cookies = 0          //设置客户端是否使用cookie来保存session值  该参数的值不影响上述机制的进行。这个可改可不改


手动模式:

index1.php

<?php
session_start();
$_SESSION['name'] = "zhangsan";
$_SESSION['age'] = 100;
 
echo  'session save succes! click <a href="index2.php?'.SID.'">here</a> to see SID<br/>';


index2.php

<?php
if($_GET["PHPSESSID"]){
    session_id($_GET["PHPSESSID"]);
}
session_start();
echo session_id().'<br/>';
echo $_SESSION['name'];


而自动模式,会将url后面自动添加PHPSESSID参数,所以在index1.php中去掉SID即可,index2.php不变。

index1.php

<?php
session_start();
$_SESSION['name'] = "zhangsan";
$_SESSION['age'] = 100;
 
echo  'session save succes! click <a href="index2.php">here</a> to see SID<br/>';



11,php.ini中关于session和cookie的配置

(1) session.use_trans_sid = 0                 //开启后,默认为每个url后添加了session_name=session_id。

(2) session.save_path="c:/mysession"  //save_path是session文件在服务器的存放路径。

(3) session.gc_maxlifetime = 1440       //session默认最大生命周期,当session文件在1440s后没被访问的话,则该session被视为“垃圾文件”,并且等待gc(垃圾回收)进程的调用时候被清理掉;session.gc_probability=1;session.gc_divisor=1000;这两个参数根据网站规模合理设置。每当初始化一个session时候,有gc_probability/gc_divisor的概率执行一次垃圾回收。


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

527602-20161012001042968-352947356.png

当其中两个会话在30秒内没有被调用,三个session文件,应该只剩下一个了。

527602-20161012001052203-1655209067.png

2018-06-17 0 /
PHP学习
/
标签: 

评论回复

回到顶部