>시스템 튜토리얼 >리눅스 >PHP의 세션 가비지 수집 메커니즘 이해

PHP의 세션 가비지 수집 메커니즘 이해

王林
王林원래의
2024-08-08 09:08:11362검색
1. php
의 세션 생성 메커니즘

먼저 PHP에서 세션이 어떻게 생성되는지 분석해 보겠습니다. 세션을 설계하는 목적은 HTTP 프로토콜(stateless)의 단점을 보완하기 위해 각 사용자의 다양한 상태를 유지하는 것입니다. 이제 질문이 있습니다. 세션은 각 사용자의 상태를 유지하는 데 사용되므로 사용자를 구별하는 데 사용되는 것은 무엇입니까? 이 때 쿠키를 사용해야 합니다. 코드에서 session_start();를 호출하면 PHP는 SESSION 저장소 디렉터리(기본값은 /tmp/)와 클라이언트의 쿠키 디렉터리에 각각 파일을 생성합니다. 세션 파일 이름은 다음과 같습니다:

PHP의 세션 가비지 수집 메커니즘 이해

형식은 sess_{SESSIONID}입니다. 현재 세션 파일에는 다음 두 줄의 코드를 추가했습니다.

코드를 복사하세요코드는 다음과 같습니다
으아악
코드를 복사하세요코드는 다음과 같습니다
으아악

지금 쿠키를 다시 살펴보세요:

PHP의 세션 가비지 수집 메커니즘 이해

서버가 자동으로 쿠키를 생성한 것을 볼 수 있습니다. 쿠키 이름은 "PHPSESSID"이고 쿠키 내용은 문자열입니다. 실제로 이 문자열은 {SESSIONID}입니다. 어쩌면 세션을 사용할 때 PHP가 먼저 고유한 SESSIONID 번호(예: 2bd170b3f86523f1b1b60b55ffde0f66)를 생성한 다음 서버의 기본 디렉터리에 sess_{SESSIONID}라는 파일 이름으로 파일을 생성한다는 사실을 이미 알고 계실 것입니다. 동시에 현재 사용자의 클라이언트 측에 쿠키가 생성되며 해당 콘텐츠는 이미 언급되었습니다. 이러한 방식으로 PHP는 각 사용자에 대해 SESSIONID를 생성합니다. 이는 각 사용자에 대해 하나의 세션 파일을 의미합니다. PHP가 사용자를 위한 세션을 처음 사용할 때 클라이언트에 쿠키를 기록합니다. 나중에 사용자가 방문할 때 브라우저는 쿠키를 가져온 후 이 쿠키를 가져옵니다. PHP는 내부에서 SESSIONID를 읽고 이 SESSIONID를 보관합니다. 세션 파일을 찾으려면 세션 디렉터리로 이동하세요. 찾은 후 $_SESSION['blog']를 호출하면 표시됩니다.

2. php
의 세션 만료 재활용 메커니즘

세션의 생성 및 작동 원리를 이해하고 세션 디렉터리에 많은 세션 파일이 있음을 확인했습니다. 물론 이러한 파일은 영원히 존재해서는 안 되며 PHP는 만료된 재활용 메커니즘을 제공해야 합니다. php.ini에서 session.gc_maxlifetime은 세션의 수명을 설정합니다(기본값은 1440초). 세션 파일의 마지막 업데이트 시간이 생존 시간을 초과하면 세션 파일이 만료된 것으로 간주됩니다. 다음에 세션이 재활용되면 삭제됩니다. 다음 세션은 언제 재활용되나요? 이는 PHP 요청 수와 관련이 있습니다. PHP의 내부 메커니즘에서는 PHP가 N번 요청되면 재활용 메커니즘이 한 번 트리거됩니다. 요청이 트리거되는 횟수는 다음 두 매개변수에 의해 제어됩니다.

코드를 복사하세요코드는 다음과 같습니다
session.gc_probability = 1session.gc_divisor = 100

这是php.ini的默认设置,意思是每100次PHP请求就有一次回收发生。概率是 gc_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。

如果cookie失效了浏览器自然发送不了cookie到服务器,这时即使服务器的session文件存在也没用,因为PHP不知道要读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的生命周期是多久呢?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制session的失效时间了。

3、php中session的客户端存储机制

由上面的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没法工作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页面,那我们还有另一个法宝,就是通过页面GET传值的方式。

PHP可以在cookie被禁用时自动通过GET方式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另一页面时,PHP会自动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种方式的缺点:好像不够安全啊。

위 내용은 PHP의 세션 가비지 수집 메커니즘 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.