搜索
首页后端开发php教程php中session与thinkphp中session的一些用法_PHP教程

session是php中一个很常用的全局变量了,下面我来给初学者来介绍关于php session一些用法总结,希望些方法对各位初学php朋友会有帮助哦,下面大家一起来看看吧。

PHP服务端默认的session存储是文件存放方式,在Windows上PHP默认的Session服务端文件存放在C:/WINDOWS/Temp下,*NIX下默认存放在/tmp下,如果说并发访问很大或者session建立太多,在这两个目录下就会存在大量类似sess_xxxxxx的session文件,同一个目录下文件数过多会导致性能下降,并且可能导致受到攻击最终出现文件系统错误。针对这样的情况,PHP本身体提供了比较好的解决办法。
不少朋友可能都没有注意到php.ini里面Session设置部分中有这样一项:
; session.save_path = "N; MODE; /path"

这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,“MODE”表示目录的权限属性,默认为600,在WINDOWS上基本是不用设置的,*NIX上也可以不用设置,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式

session.save_path = "2; /tmp/phpsession"

上面的设置表示我们把/tmp/phpsession目录作为php的session文件存放根目录,在该目录下进行两级目录散列,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。

需要注意的是,php自己并不会自动创建子目录,需要您自己动手去创建,以下自动创建目录的代码,大家可以做个参考。下面的代码自动创建3级子目录,可以自己动手根据需要进行修改。

 代码如下 复制代码
set_time_limit(0);
 
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
 
$length = strlen($string);
 
function makeDir($param)
 
{
 
if(!file_exists($param)) {
 
makeDir(dirname($param));
 
mkdir($param);
 
}
 
}
 
for($i = 0; $i  
for($j = 0; $j  
for($k = 0; $k  
makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]);
 
}
 
}
 
}
 
?>

下面提供两种更好的解决方案:
1.session入库

利用session_set_save_handler函数

作用:自定义SESSION 存储机制。

可用于修改session存储介质,如进行session入库等操作。

实例代码

 代码如下 复制代码
class sessionsTable extends db{
    protected $table_name = 'sessions';
    public function __construct(){
        parent::__construct();
        session_set_save_handler(
        array($this,'sess_open'),
        array($this,'sess_close'),
        array($this,'sess_read'),
        array($this,'sess_write'),
        array($this,'sess_destroy'),
        array($this,'sess_gc')
        );
        session_start();
    }
    public function sess_open($save_path,$session_name){
        return true;
 
    }
    public function sess_close(){
        return true;
    }
 
 
    public function sess_read($sess_id){
        $sql = "select * from {$this->getTable()} where sess_id='{$sess_id}'";
        $row = $this->getRow($sql);
        return $row['sess_data'];
    }
    public function sess_write($sess_id,$sess_data){
 
        $expire = time();
        $sql = "insert into {$this->getTable()} values('{$sess_id}','{$sess_data}','{$expire}') on duplicate key
        update sess_data='{$sess_data}',expire='{$expire}'";
        return $this->query($sql);
    }
 
    public function sess_destroy($sess_id){
 
        $sql = "delete from {$this->getTable()} where sess_id='{$sess_id}'";
 
        return $this->query($sql);
 
    }
    public function sess_gc($life_time){
        $expire = time() - $life_time;
        $sql = "delete from {$this->getTable()} where expire         return $this->query($sql);
    }
 
 
 
}

2.用memcache来存储session


方法I: 在 php.ini 中全局设置
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

方法II:在某个一个应用中利用ini_set设置
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");

使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。

1.在php中如何操作session:

session_start();   //使用该函数打开session功能

$_SESSION       //使用预定义全局变量操作数据

使用unset($_SESSION['key']) //销毁一个session的值

简单地操作,一切都是由服务器实现;由于处理在后台,一切看起来也很安全。但是session采用什么样机制,又是怎样被实现,并且如何来保持会话的状态的呢?

 

2.session实现与工作原理

浏览器和服务器采用http无状态的通讯,为了保持客户端的状态,使用session来达到这个目的。然而服务端是怎么样标示不同的客户端或用户呢?
这里我们可以使用生活中的一个例子,假如你参加一个晚会,认识了很多人,你会采取什么方式来区分不同的人呢!你可能根据脸型,也有可能根据用户的名字,
或者人的身份证,即采用一个独一无二的标示。在session机制中,也采用了这样的一个唯一的session_id来标示不同的用户,不同的是:浏览器每次请求都会带上
由服务器为它生成的session_id.

简单介绍一下流程:当客户端访问服务器时,服务器根据需求设置session,将会话信息保存在服务器上,同时将标示session的session_id传递给客户端浏览器,
浏览器将这个session_id保存在内存中(还有其他的存储方式,例如写在url中),我们称之为无过期时间的cookie。浏览器关闭后,这个cookie就清掉了,它不会存在用户的cookie临时文件。
以后浏览器每次请求都会额外加上这个参数值,再服务器根据这个session_id,就能取得客户端的数据状态。

如果客户端浏览器意外关闭,服务器保存的session数据不是立即释放,此时数据还会存在,只要我们知道那个session_id,就可以继续通过请求获得此session的信息;但是这个时候后台的session还存在,但是session的保存有一个过期
时间,一旦超过规定时间没有客户端请求时,他就会清除这个session。

下面介绍一下session的存储机制,默认的session是保存在files中,即以文件的方式保存session数据。在php中主要根据php.ini的配置session.save_handler
 来选择保存session的方式。

这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。
一个简单的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"

当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。

刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。

ThinkPHP官方的说明文档

01.start 启动session

02.pause 暂停session
03.clear 清除session
04.destroy 销毁session
05.get 获取session值
06.getLocal 获取私有session值
07.set 设置session值
08.setLocal 设置私有session值
09.name 获取或者设置session_name
10.is_set 是否设置session值
11.is_setLocal 是否设置私有session值
12.id 获取或者设置session_id
13.path 获取或者设置session_save_path
14.setExpire 设置session过期时 间
15.setCookieDomain 设置有效域名
16.setCallback 设置Session 对象反序列化时候的回调函数
最常用的操作方法示例:

代码: 01.// 检测Session变量是否存在

 代码如下 复制代码

02.Session::is_set('name');

03.
// 给Session变 量赋值
04.
Session::set('name','value');
05.
// 获取Session变量
06.
Session::get('name');

和Session相关的配置参数:

代码:

 代码如下 复制代码

01.'SESSION_NAME'=>'ThinkID',                // 默认Session_name

02.       
'SESSION_PATH'=>'',                        // 采用默认的Session save path
03.       
'SESSION_TYPE'=>'File',                        // 默认Session类型 支持 DB 和 File 
04.       
'SESSION_EXPIRE'=>'300000',                // 默认Session有效期
05.       
'SESSION_TABLE'=>'think_session',        // 数据库Session方式表名
06.       
'SESSION_CALLBACK'=>'',                        // 反序列化对象的回调方法

其中SESSION_NAME 参数需要注意,如果需要在不同的项目之间不共享传递Session的值,请设置不同的值,否则请保留相同的默认值。
如 果设置了相同的SESSION_NAME的值,但是又希望创建基于项目的私有Session空间,应该怎么处理呢?ThinkPHP还支持以项目为 Session空间的私有Session操作,以之前的常用操作为例,我们更改如下:

代码:

 代码如下 复制代码

01.// 检测Session变量是否存在(当前项目有效)
02.Session::is_setLocal('name');

03.
// 给Session变 量赋值(当前项目有效)
04.
Session::setLocal('name','value');
05.
// 获取Session变量(当前 项目有效)
06.
Session::getLocal('name');

这样,和全局的Session操作就不会冲突,可以用于一些特殊情况的需要。

ThinkPHP支持数据库方式的Session操 作,设置SESSION_TYPE的值为DB就可以了,如果使用数据库方式,还要确保设置好SESSION_TABLE的值,并且导入下面的DDL到你的 数据库(以MySQL为例子):

代码:

 代码如下 复制代码

01.CREATE TABLE `think_session` (

02.  `
id` int(11) unsigned NOT NULL auto_increment,
03.  `
session_id` varchar(255) NOT NULL,
04.  `
session_expires` int(11) NOT NULL,
05.  `
session_data` blob,
06. 
PRIMARY KEY  (`id`)        
07.)

注意,Db Session方式的数据库连接会采用项目的数据库配置信息进行连接。除了数据库方式外,还可以增加其它方式的Session保存机制,例如内存方式、 Memcache方式等,我们只要增加相应的过滤器就行了,使用session_set_save_handler 方法,具体的方法定义参考Think.Util.Filter下面的FilterSessionDb.class.php 文件的实现。

 制作了一个简单的登陆判断

登陆检测之后赋予Session值,使Session的值为非空即为假的false

 代码如下 复制代码
$_SESSION[C('USER_AUTH_KEY')] = $logInFind['id'] ;

其中 [C('USER_AUTH_KEY')]为ThinkPHP的内置方法和函数类。在未配置config.php文件时默认为空
把$logInFind['id'] 取出的帐号值赋予它,默认为关闭页面Session就自动删除消失!

其它页面使用下面格式判断

 代码如下 复制代码
if(!isset($_SESSION[C('USER_AUTH_KEY')])) {  //isset 是检测变量是否赋值!
     $this->redirect('Login','Login'); //转到注册页面
    }

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/632699.htmlTechArticlesession是php中一个很常用的全局变量了,下面我来给初学者来介绍关于php session一些用法总结,希望些方法对各位初学php朋友会有帮助哦,下...
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP和Python:解释了不同的范例PHP和Python:解释了不同的范例Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python:深入了解他们的历史PHP和Python:深入了解他们的历史Apr 18, 2025 am 12:25 AM

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

在PHP和Python之间进行选择:指南在PHP和Python之间进行选择:指南Apr 18, 2025 am 12:24 AM

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP和框架:现代化语言PHP和框架:现代化语言Apr 18, 2025 am 12:14 AM

PHP在现代化进程中仍然重要,因为它支持大量网站和应用,并通过框架适应开发需求。1.PHP7提升了性能并引入了新功能。2.现代框架如Laravel、Symfony和CodeIgniter简化开发,提高代码质量。3.性能优化和最佳实践进一步提升应用效率。

PHP的影响:网络开发及以后PHP的影响:网络开发及以后Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?Apr 17, 2025 am 12:24 AM

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP与Python:用例和应用程序PHP与Python:用例和应用程序Apr 17, 2025 am 12:23 AM

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。