Bootstrap

入门PHP就来我这(高级)25 ~ Session高级应用

有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享

路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。

 


1 Session高级

1.1 Session临时文件

在服务器中,如果将所有用户的Session都保存到临时目录中,会降低服务器的安全性和效率,打开服务器存储站点会非常慢。

使用PHP函数session_save_path()处处Session临时文件,可以缓解因临时文件的存储导致服务器效率降低和站点打开缓慢的问题。

<?php
 $path='./tmp/';
 session_save_path($path);
 session_start();
 $_SESSION['username']='lufei';
?>

1.2 Session缓存

Session缓存是将网页的内容临时存储到客户端的文件夹下,并且可以设置缓存的时间。当第一次浏览网页后,页面的部分内容在规定时间内就会被临时存储在客户端的临时文件夹中,这样在下次访问这个页面时,就可以直接读取缓存中的内容,从而提高网站的浏览效率。

使用session_cache_limiter()函数实现Session缓存语法如下:

string session_cache_limiter([string cache_limiter]);

 注意:参数cache_limiter值为public或private。同时Session缓存并不是指在服务器端而是在客户端缓存,但在服务器中没有显示。

使用session_cache_expire()函数设置缓存时间,语法如下:

int session_cache_expire([int new_cache_expire]);
//new_cache_expire是session缓存的时间数字,单位是分钟。

注意:这两个缓存函数要在session_start()之前调用,否则会出现错误。

<?php
 //设置缓存限制为private
 session_cache_limiter('private');
 $cache_limiter = session_cache_limiter();
 //设置缓存过期时间为10分
 session_cache_expire(10);
 $cache_expire = session_cache_expire();
 //开启会话
 session_start();
 echo "缓存限制为:".$cache_limiter."<br>";
 echo "客户端缓存时间为:".$cache_expire."分";
?>

 1.3 Session数据库存储

PHP默认采用文件的方式来保存Session,虽然通过改变Session存储文件夹,使Session不至于因为临时文件夹被填满而造成站点瘫痪,但是可以计算以下:如果一个大型网站一天登录1000人,一月登录30000人,这时站点中就存30000个Session文件,要在这30000个文件中查询一个session_id应该是不容易的,这时候就可以应用Session数据库存储,也就是PHP中的session_set_save_handler()设置自定义会话存储函数。语法如下:

bool session_set_save_handler(SessionHandlerInterface $sessionhandler [, bool $register_shutdown=true ])
//实现SessionHandlerInterface接口
//register_shutdown将函数session_write_close注册为register_shutdown_function()函数。
案例展示:
1.3.1 创建sessions表:

1.3.2 创建mysqlSession

来实现SessionHandlerInterface,实现数据库的操作,详情代码如下:

<?php
 class mysqlSession implements SessionHandlerInterface{
  private $pdo = null;

 
  /***
   * 连接数据库
   */
  public function open($save_path,$session_name){
    $dsn = "mysql:host=localhost;dbname=db_test";
    try {
      $this->pdo = new PDO($dsb,'root','passwd');
      return true;
    } catch (PDOException $e) {
      return false;
    }
  }


  /**
   * 关闭数据库
   */
  public function close(){
    $this->pdo = null;
    return true;
  }


  /**
   * 读取session信息
   */
  public function read($sessionId){
    try {
      $pdo = new PDO("mysql:host=localhost;dbname=db_test", 'root', 'passwd');
      // 设置错误模式为异常
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $sql= 'select * from  sessions where id = ? limit 1';
      $res = $pdo->prepare($sql);
      $res->execute(array($sessionId));
      if($ret = $res->fetch(PDO::FETCH_ASSOC)){
        return $ret['data'];
      } else {
        return '';
      }
    
    } catch (PDOException $e) {
      return '';
    }
  }


  /**
   * 写入或修改session数据
   */
  public function write($sessionId, $sessionData){
    try {
      $pdo = new PDO("mysql:host=localhost;dbname=db_test", 'root', 'passwd');
      // 设置错误模式为异常
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $sql = 'replace into sessions (id, data,last_accessed)values(?,?,?)';
      $res = $pdo->prepare($sql);
      $res->execute(array($sessionId, $sessionData,date("Y-m-d")));
      return true;
    } catch (PDOException $e) {
      return false;
    }

  }


 /**
  * 销毁session会话
  */
 public function destroy($sessionId){
  try {
    $pdo = new PDO("mysql:host=localhost;dbname=db_test", 'root', 'passwd');
      // 设置错误模式为异常
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql= 'delete  from  sessions where id = ?';
    $res = $pdo->prepare($sql);
    $res->execute(array($sessionId));
    return true;
  } catch (PDOException $e) {
    return false;
  }
 }

 /**
  * 清理会话中的过期数据
  */
 public function gc($maxlifetime){
  try {
    $pdo = new PDO("mysql:host=localhost;dbname=db_test", 'root', 'passwd');
      // 设置错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql= 'delete from sessions where DATE_ADD(last_accessed,INTERVAL ? SECOND) < NOW()';
    $res = $pdo->prepare($sql);
    $res->execute(array($maxlifetime));
    return true;
  } catch (PDOException $e) {
    return false;
  }
 }

}
?>

注意:此时所使用的php版本是php5.4,好像最新的php8和php7会出现问题。

1.3.3 index.php测试:
<?php

require_once('./config.php');
require_once('./session.php');
$sess = new mysqlSession();
session_set_save_handler($sess);
session_start();
$_SESSION['username']='lufei';
$_SESSION['password']=md5('123456');
echo "<pre>";
var_dump($_SESSION);

?>

运行效果如下:

此时查看数据库内容:

数据已经被存储到数据库里了,本次案例结束。

 下一篇 PHP图形图像处理

大家如果喜欢技术,并想有个好的交流平台可以关注我的 我的知乎首页,会不定期分享本人觉得比较好的技术类电子书。
另外,自己创建的一个技术qq群,玩转技术群,该群里功能:分享技能,电子书,源代码,以及兼职项目等交流,欢迎大家加入一起交流。

悦读

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

;