찾다
백엔드 개발PHP 튜토리얼从手册去理解分析PHP session机制_PHP教程
从手册去理解分析PHP session机制_PHP教程Jul 21, 2016 pm 03:26 PM
fileshandlerphpsession분석하다가다수동기구이해하다

session.save_handler = files
1. session_start()

session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,但是有的系统是 session.gc_probability = 0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。

复制代码 代码如下:

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440//过期时间 默认24分钟
//概率是 session.gc_probability/session.gc_divisor 结果 1/1000,
//不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。
session.save_path = //好像不同的系统默认不一样,有一种设置是 "N;/path"
//这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本

session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,这个值可以从php.ini找到 session.name = PHPSESSID //默认值PHPSESSID

如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端.相当于执行了下面COOKIE 操作,注意的是,这一步执行了setcookie()操作,COOKIE是在header头中发送的,这之前是不能有输出的,PHP有另外一个函数 session_regenerate_id() 如果使用这个函数,这之前也是不能有输出的。
复制代码 代码如下:

setcookie(session_name(),
session_id(),
session.cookie_lifetime,//默认0
session.cookie_path,//默认'/'当前程序跟目录下都有效
session.cookie_domain,//默认为空
)

如果存在,那么session_id = $_COOKIE[session_name]; 然后去session.save_path指定的文件夹里去找名字为'SESS_' . session_id()的文件。读取文件的内容反序列化,然后放到$_SESSION中。

2. 为$_SESSION赋值

比如新添加一个值$_SESSION['test'] = 'blah'; 那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,用把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源。

这个阶段有可能执行更改session_id的操作,比如销毁一个旧的的session_id,生成一个全新的session_id.一半用在自定义 session操作,角色的转换上,比如Drupal.Drupal的匿名用户有一个SESSION的,当它登录后需要换用新的session_id。
复制代码 代码如下:

if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 42000, '/');//旧session cookie过期
}
session_regenerate_id();//这一步会生成新的session_id
//session_id()返回的是新的值

3. 写入SESSION操作

在脚本结束的时候会执行SESSION写入操作,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,可能需要创建新的文件。

4. 销毁SESSION

SESSION发出去的COOKIE一般属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多:

setcookie(session_name(), session_id(), time() - 8000000, ..);//退出登录前执行
usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据。
session_destroy();//这个作用更彻底,删除$_SESSION 删除session文件,和session_id
当不关闭浏览器的情况下,再次刷新,2和3都会有COOKIE传过来,但是找不到数据。

session.save_handler = user
用户自定义session处理机制,更加直观 session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');

session_start(), 执行open($save_path, $session_name)打开session操作句柄。 $save_path 在session.save_handler = files的情况下它就是session.save_path,但是如果用户自定的话,这个两个参数都用不上,直接返回TRUE。执行read($id)从中读取数据.//这个参数是自动传递的就是session_id(),可以通过这个值进行操作。

脚本执行结束,执行write($id, $sess_data) //两个参数,很简单

假如用户需要session_destroy(),先执行destroy,再执行第2步

一个实际例子:
复制代码 代码如下:

//SESSION初始化的时候调用
function open($save_path, $session_name)
{
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}

//关闭的时候调用
function close()
{
return(true);
}

function read($id)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return (string) @file_get_contents($sess_file);
}
//脚本执行结束之前,执行写入操作
function write($id, $sess_data)
{
echo "sdfsf";
global $sess_save_path;

$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "w")) {
$return = fwrite($fp, $sess_data);
fclose($fp);
return $return;
} else {
return(false);
}

}

function destroy($id)
{
global $sess_save_path;

$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}

function gc($maxlifetime)
{
global $sess_save_path;

foreach (glob("$sess_save_path/sess_*") as $filename) {
if (filemtime($filename) + $maxlifetime @unlink($filename);
}
}
return true;
}

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/323987.htmlTechArticlesession.save_handler = files 1. session_start() session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,PHP自身的垃圾...
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
游戏中打击噪音减少的键盘推荐游戏中打击噪音减少的键盘推荐Jan 05, 2024 am 10:36 AM

去推荐静音游戏键盘如果你想在游戏中享受安静的体验,可以考虑购买一款静音游戏键盘。推荐的产品有CherryMXSilent、LogitechG915和SteelSeriesApexPro等。这些键盘都具有低噪音的特点,操作轻便且响应迅速。此外,建议选择具有可调节背光亮度、可编程功能和舒适手感等特点的键盘,以满足更好的使用需求。公认最静音的键盘《杜伽K320》是一款备受喜爱的电子产品。它以其出色的性能和功能而闻名,是许多人心目中的理想之选。无论是游戏、娱乐还是办公,杜伽K320都能提供出色的表现。它

我准备去西藏旅行背包去①背多少升的包合适把你认为最好的配置说下本人170体力不错第一次我准备去西藏旅行背包去①背多少升的包合适把你认为最好的配置说下本人170体力不错第一次Jan 07, 2024 am 10:06 AM

我准备去西藏旅行背包去①背多少升的包合适把你认为最好的配置说下本人170体力不错第一次去徒步多就60升或以上的徒步少就60升以下的全程都坐车就不用背包,旅行箱更方便,真要随身带东西,弄个25~40升的就绰绰有馀西藏旅游必备用品:太阳镜、太阳帽、防晒霜、护肤霜、润唇膏、长袖上衣、毛衣;对于特殊旅游或去阿里、藏北、川藏线旅游,建议带:睡袋(防寒)、床单(防脏)、羽绒服、旅游鞋或登山鞋、拖鞋、牙刷、牙膏、毛巾、卷筒纸、纸内裤、消毒湿巾、手电筒、防水火柴、刀具、绳子。前运包能装电脑吗能装电脑,有些背包有

最近大火的Diffusion Model,首篇扩散生成模型综述!最近大火的Diffusion Model,首篇扩散生成模型综述!Apr 09, 2023 pm 08:31 PM

本综述(Diffusion Models: A Comprehensive Survey of Methods and Applications)来自加州大学&Google Research的Ming-Hsuan Yang、北京大学崔斌实验室以及CMU、UCLA、蒙特利尔Mila研究院等众研究团队,首次对现有的扩散生成模型(diffusion model)进行了全面的总结分析,从diffusion model算法细化分类、和其他五大生成模型的关联以及在七大领域中的应用等方面展开,

深入理解Linux管道的使用方法深入理解Linux管道的使用方法Feb 21, 2024 am 09:57 AM

深入理解Linux管道的使用方法在Linux操作系统中,管道是一种非常有用的功能,能够将一个命令的输出作为另一个命令的输入,从而方便地实现各种复杂的数据处理和操作。深入理解Linux管道的使用方法对于系统管理员和开发人员来说非常重要。本文将介绍管道的基本概念,并通过具体的代码示例来展示如何使用Linux管道进行数据处理和操作。1.管道的基本概念在Linux

如何正确理解PHP中的值传递方式如何正确理解PHP中的值传递方式Mar 08, 2024 pm 03:30 PM

如何正确理解PHP中的值传递方式PHP是一种广泛应用于Web开发的脚本语言,而在PHP中的参数传递方式主要有值传递和引用传递两种。而理解PHP中的值传递方式对于编写高效的代码至关重要。本文将详细讨论PHP中的值传递方式,并通过具体的代码示例来帮助读者更好地理解。值传递方式的基本概念值传递是指将变量的值复制一份传递给函数或方法,在函数内部对该值的操作不会影响到

理解Go语言注释的重要性理解Go语言注释的重要性Mar 29, 2024 pm 04:48 PM

在Go编程中,注释是一个非常重要的部分。注释可以帮助程序员更好地理解代码的逻辑、目的和细节,从而提高代码的可读性和可维护性。本文将介绍Go语言中注释的重要性,并结合具体的代码示例来说明注释对代码理解的帮助。首先,让我们来看一个简单的Go程序示例:packagemainimport"fmt"funcmain(){/

深入理解Go语言文档中的strings.Split函数深入理解Go语言文档中的strings.Split函数Nov 04, 2023 pm 01:14 PM

深入理解Go语言文档中的strings.Split函数,需要具体代码示例在Go语言中,字符串操作是非常常见的需求。其中,strings包是Go语言提供的一个标准包,提供了丰富的字符串处理函数。其中,strings.Split函数是其中一个常用的函数,它的作用是根据指定的分隔符将一个字符串拆分成一个字符串切片。在正式深入探讨strings.Split函数之前,

理解ThinkPHP6的中间件理解ThinkPHP6的中间件Jun 20, 2023 am 10:03 AM

随着现代Web应用程序的复杂性不断增加,代码逻辑也变得越来越复杂。为了解决这个问题,中间件在现代Web开发中变得越来越流行。ThinkPHP6是一个流行的PHP框架,它也支持中间件。在这篇文章中,我们将讨论ThinkPHP6中间件的基础知识和实际使用。什么是中间件?在Web开发中,中间件是指对HTTP请求和响应进行处理的一种方式。当客户端发送请求至服务器时,

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구