> 백엔드 개발 > PHP 문제 > 세션에 대한 자세한 이해

세션에 대한 자세한 이해

王林
풀어 주다: 2023-02-23 10:12:02
앞으로
3464명이 탐색했습니다.

1. 세션이란 무엇입니까

세션의 공식 정의는 다음과 같습니다. 세션: 컴퓨터, 특히 네트워크 응용 프로그램에서는 "세션 제어"라고 합니다. Session 개체는 특정 사용자 세션에 필요한 속성 및 구성 정보를 저장합니다.

직설적으로 말하면 세션은 서버 측을 유지할 수 있는 데이터 저장 기술입니다. 세션은 주로 다음과 같은 특징을 가지고 있습니다.

1. 세션은 서버 측에 저장됩니다.

2. 일반적으로 세션은 쿠키와 함께 사용됩니다. 브라우저에서 쿠키 기능을 비활성화하면 URL 재사용만 사용할 수 있습니다. 세션 저장 기능

3. 단순히 사용자 상태를 유지하기 위해 세션을 사용한다면, 동시에 로그인하는 사용자가 많거나, 세션 수가 많을 때 쿼리 속도가 느려지는 문제가 발생할 수 있습니다

본질 위: 세션 기술은 데이터베이스와는 달리 백엔드를 기반으로 데이터를 임시 저장하는 기술입니다. 2. 세션이 존재하는 주요 이유 중 하나는 무국적(Stateless)이기 때문입니다. HTTP이므로 HTTP 요청을 보낼 때 현재 사용자의 상태, 즉 현재 어떤 사용자가 있는지 등의 정보를 알 수 없으므로 이때 현재 상태를 식별하려면 세션이 필요합니다

3. 세션의 작동 원리

다음으로, 사용자 로그인을 시뮬레이션하는 흐름도를 통해 먼저 세션의 원리를 이해해 보겠습니다. 이때 사용자가 로그인 작업을 수행한다고 가정합니다.

전체 프로세스는 대략 다음과 같은 몇 가지 단계로 나뉩니다.

1. 첫 번째 단계는 로컬 쿠키의 세션 ID, 사용자 이름 및 비밀번호를 백그라운드로 가져오는 것입니다.

2. 백그라운드에 해당 세션 ID가 있는지 확인하려면 PHP를 예로 들어 해당 PHPSESSID가 수신되었는지 감지합니다.

세션에 대한 자세한 이해3. 그렇지 않은 경우 직접 새 세션을 생성합니다. 그렇다면 해당 파일이 존재하고 유효한지 확인하세요

3. 유효하지 않은 경우 세션을 지우고 새 세션을 생성해야 합니다. 유효하지 않습니다. 현재 세션을 사용하세요

여기에서 세션의 작동 원리를 미리 이해할 수 있습니다

세션의 도식은 다음과 같습니다.

4. 세션의 일반적인 구성

세션 구성을 설명하기 위해 PHP를 예로 들어 보겠습니다. 세션에 대한 자세한 이해

먼저 PHP 설치 디렉터리에서 php.ini 파일을 찾아야 합니다. 이 파일의 주요 기능은 PHP의 일부 구성을 구성하는 것입니다. 나중에 자세히 논의하겠습니다.

1. 세션이 저장될 때 쿠키에서 식별되는 필드 이름을 설정합니다. php의 기본값은 PHPSESSID
해당 설정은 session.name = PHPSESSID입니다.

2. 클라이언트가 쿠키를 비활성화하는 경우 session.use_trans_sid를 설정하여 ID의 상호 작용 방법을 쿠키에서 URL 전달로 변경할 수 있습니다. 해당 설정은 session.use_trans_sid = 0입니다. code>

3. 세션 저장 위치 설정

해당 설정은 session.save_path="D:phpStudyPHPTutorialtmptmp"PHPSESSID

  对应的设置为:session.name = PHPSESSID

  2. 如果客户端禁用了cookie,可以通过设置session.use_trans_sid来使标识的交互方式从cookie变为url传递

    对应的设置为:session.use_trans_sid = 0

  3. 设置session的保存位置

  对应的设置是session.save_path="D:phpStudyPHPTutorialtmptmp"

5、PHP中的session实战

 首先我们需要安装wamp或者是phpstudy,具体方式自行百度

 为了方便观察session文件的变化,我们需要找到session的保存路径(在php.ini中找到session.save_path),如下:

세션에 대한 자세한 이해

然后找到所指向的目录,注意一般来说session是使用files的形式来保存的,但是我们也可以根据自己的实际情况进行修改。我们可以在php.ini文件中进行修改和查看。

세션에 대한 자세한 이해

 使用session的第一步,我们要打开session,使用session_start()

5입니다. PHP에서 세션 연습

먼저. wamp 또는 phpstudy를 설치해야 하며 구체적인 방법은 Baidu에 있습니다세션에 대한 자세한 이해

세션 파일의 변경 사항을 쉽게 관찰하려면 다음의 저장 경로를 찾아야 합니다. 다음과 같이 세션(php.ini session.save_path에서 찾기): <p></p> <img src="https://img.php.cn/upload/image/645/704/972/%201566280902304346.jpg" title="1566280902304346.jpg" alt="세션에 대한 자세한 이해"><p><img src="https://img.php.cn/upload/image/873/651/859/1566281099926592.jpg" title="1566281099926592.jpg" alt="세션에 대한 자세한 이해"> 그런 다음 가리키는 디렉터리를 찾습니다. 일반적으로 세션은 파일 형식으로 저장되지만 다음 사항에 따라 수정할 수도 있습니다. 우리의 실제 상황. php.ini 파일에서 수정하고 볼 수 있습니다. </p> <p><img src="https://img.php.cn/upload/image/738/444/281/1566280946577136.jpg" title="1566280946577136.jpg" alt="세션에 대한 자세한 이해"></p> <p> 사용 세션의 첫 번째 단계에서는 세션을 열고 <code>session_start()를 사용해야 합니다. 그런 다음 생성된 세션에 변수를 추가하고 값은 기본값이라고 가정합니다.

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default";
?>
로그인 후 복사

실행 효과는 다음과 같습니다. 세션에 대한 자세한 이해

🎜🎜🎜🎜해당 파일을 열면 내부 내용은 다음과 같습니다. 🎜🎜🎜🎜🎜s:7은 길이가 7인 문자열 유형의 문자열 유형을 나타냅니다. 🎜🎜 ​​만약 내용을 다시 편집한다면 효과는 다음과 같습니다: 🎜🎜🎜🎜

我们观察最近一条的修改日期,我们可以发现就是日期发生了变化,但是文件名没有变化,也就是说,修改session中的内容不会导致文件被新建,而是执行对文件的重新写入操作

session的销毁

销毁session一般有两种方式,unsetsession_destroy,我们先来说说第一种

代码如下:

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
//session的销毁
unset($_SESSION);
?>
로그인 후 복사

这一个相当于没有删除session文件,但是使得即使有对应的PHPSESSID也无法获取到相应的session

session_destroy()相对来说比较彻底,直接删除对应的session文件

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
var_dump(session_name());
//session的销毁
session_destroy();
?>
로그인 후 복사

세션에 대한 자세한 이해

对于个人来说比较推荐使用第二种方法,因为当要销毁session的时候,那么也就意味着session已经失效了,所以这个时候我们把它给删掉才是最好的处理方式,一方面可以减少对硬盘的存储,另外一方面可以相对优化session的查询速度。

好了,这个时候我们应该要设置传递给浏览器端的cookie了,默认是自动传送,但是我们应该要学习的是怎样通过后端设置cookie过去

其中有两个方法与session有关的方法我们需要记住,第一个是session_name(),这个是获取cookie的key值得,第二个是session_id,这个是session的文件名

设置的示例代码:

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
setCookie(session_name(),session_id(),time()-1000);
?>
로그인 후 복사

在设置cookie的时候,我们为了程序的安全性,我们应该要禁止JS可以对cookie进行重写,所以需要设置HTTP ONLY,具体的设置方法在Php.ini中找到session.cookie_httponly

然后将其的值设置为1或者true即可

除此之外还可以通过setCookieini_set()来动态设置HTTPONLY属性

在使用session的时候,虽然会从浏览器把PHPSESSID传给后端,但是这个课程不需要人为的去参与。我们只需要保证HTTPONLY被设置就行了。下面是完整的代码:

<?php
/**
 * Created by PhpStorm.
 * Date: 2017/12/16
 */
session_start();// 打开session
if ($_SESSION) {
    var_dump($_SESSION["demo1"]);
} else {
    $_SESSION["demo1"] = "default_" . time();
    var_dump($_SESSION["demo1"]);
    setCookie(session_name(), session_id(), time(), NULL, NULL, NULL, true);
}

?>
로그인 후 복사

6、session的相关注意事项

 1. 关闭浏览器session同样存在

 如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件

2.  session性能瓶颈怎样解决?

如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis或者mongodb,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度

3. 一般不使用URL重写的方法来传递PHPSESSID

其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率

更多的session的相关配置请点击这里

7、更多的一些PHP.in中的session含义

[Session]

session.save_handler =的存储方式

session.use_cookies= 1 #使用cookies在客户端保存会话

session.use_only_cookies = 1 #去保护URL中传送session id的用户

session.name = PHPSESSID #session名称(默认PHPSESSID)

session.auto_start = 0 #不启用请求自动初始化session

session.cookie_lifetime = 0 #cookie存活时间(0为直至浏览器重启,单位秒)

session.cookie_path = / #cookie的有效路径

session.cookie_domain = #cookie的有效域名

session.cookie_httponly = #httponly标记增加到cookie上(脚本语言无法抓取)

session.serialize_handler = php #PHP标准序列化

session.gc_probability =1

session.gc_divisor =1000 #建议设置1000-5000

#概率=session.gc_probability/session.gc_divisor(1/1000)

#页面访问越频繁概率越小

session.gc_maxlifetime =1440 #过期时间(默认24分钟,单位秒)

session.bug_compat_42 = off #세션 변수 전역 초기화session.bug_compat_42 = off #全局初始化session变量

session.bug_compat_warn = off

session.referer_check = #防止带有ID的外部URL

session.entopy_length = 0 #读取的字节

session.cache_limiter = {nocache,private,pblic} #HTTP缓冲类型

session.cache_expire = 180 #文档过期时间(分钟)

session.use_trans_sid = 1 #trans_sid支持(默认0)

session.hash_function = 0 #hash方法{0:md5(128 bits),1:SHA-1(160 bits)}

session.hash_bits_per_character = 5 #当转换二进制hash数据奥可读形式是,每个字符保留位数

session.save_path 

session.bug_compat_warn = off

session.referer_check = #ID 방지 외부 URL

session.entopy_length = 0 #바이트 읽기 🎜🎜session.cache_limiter = {nocache,private,pblic} #HTTP 버퍼 유형 🎜🎜session.cache_expire = 180 #문서 만료 시간(분)🎜🎜session.use_trans_sid = 1 #trans_sid 지원(기본값 0)🎜🎜session.hash_function = 0 #해시 방법 {0:md5(128비트),1:SHA-1(160비트)}🎜🎜session.hash_bits_per_character = 5 #바이너리 해시 데이터 변환 시 읽을 수 있는 형식은 예약된 자릿수 각 문자마다🎜🎜session.save_path = "/var/lib/php/session" #session id 저장 경로🎜🎜이상은 세션에 대한 자세한 설명입니다. 자세한 문의사항은 PHP를 방문해주세요. 중국어 웹사이트: 🎜https://www.php.cn/🎜🎜

위 내용은 세션에 대한 자세한 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿