> php教程 > PHP开发 > 본문

PHP에서 세션 만료 시간을 정확하게 설정하는 방법

高洛峰
풀어 주다: 2016-12-24 09:19:15
원래의
1301명이 탐색했습니다.

대부분의 경우 세션 만료 시간은 기본 설정을 사용하지만 특별한 요구 사항이 있는 경우에는 세션 만료 시간을 설정할 수 있습니다.

이를 위해 PHP에서 php.ini를 설정하고 session.gc_maxlifetime = 1440을 찾으면 됩니다. #(PHP5 기본값은 24분)
여기서 만료 시간을 마음대로 설정할 수 있다고 합니다. 설정하고 보니 안되는 것 같네요!
사실 안 되는 게 아니라 시스템이 디폴트라서:

session.gc_probability = 1
session.gc_divisor = 1000
로그인 후 복사

가비지컬렉션이 1번일 확률이 있습니다. /1000은 1000번마다 하나의 세션만 재활용된다는 의미입니다.
방문량이 많으면 재활용 효과를 얻을 수 있습니다.
또는 session.gc_divisor의 값을
설정할 수도 있습니다. 예: session.gc_divisor = 1입니다. SESSION 만료의 효과를 볼 수 있습니다.

다음 예제 프로그램에 표시된 것처럼 가장 일반적으로 사용되는 설정은 PHP 프로그램에 있습니다.

<?php
if(!isset($_SESSION[&#39;last_access&#39;])||(time()-$_SESSION[&#39;last_access&#39;])>60)
$_SESSION[&#39;last_access&#39;] = time();
?>
로그인 후 복사

원하는 경우 완료됩니다. 만료를 설정하려면 다음 프로그램에서 구현할 수도 있습니다:

<?php
unset($_SESSION[&#39;last_access&#39;]);// 或 $_SESSION[&#39;last_access&#39;]=&#39;&#39;;
?>
로그인 후 복사

세션에는 만료 메커니즘이 있습니다:

session.gc_maxlifetime 세션 만료는 작은 확률 이벤트입니다. session.gc_probability와 session은 각각 세션에서 gc를 실행할 확률을 결정하는 데 사용됩니다. session.gc_probability와 session.gc_divisor의 기본값은 각각 1과 100입니다. 는 각각 분자와 분모이므로 세션에서 gc가 실행될 확률은 1%입니다. 이 두 값을 수정하면 PHP의 효율성이 저하됩니다. 따라서 이 접근 방식은 잘못된 것입니다! !
따라서 php.ini 파일에서 gc_maxlifetime 변수를 수정하면 세션 만료 시간이 연장될 수 있습니다. (예를 들어 만료 시간을 86400초로 수정합니다.)
session.gc_maxlifetime = 86400
그런 다음 다시 시작하세요. 웹 서비스(보통 Apache)가 이를 수행합니다.

세션 "재활용"이 발생하는 시기:

기본적으로 모든 PHP 요청에 대해 재활용 확률은 1/100이므로 간단히 "100번마다"로 이해하면 됩니다. PHP 요청에 대한 수집이 발생했습니다." 이 확률은 다음 매개변수에 의해 제어됩니다.
#The 확률은 gc_probability/gc_divisor

session.gc_probability = 1
session.gc_divisor = 100
로그인 후 복사

참고 1: 이 경우 세션 파일이 다음과 같은 경우 gc_maxlifetime=120이라고 가정합니다. 마지막 수정 시간이 120초 전이면 다음 재활용(1/100 확률)이 발생할 때까지 세션이 계속 유효합니다.

참고 2: 세션이 session.save_path를 사용하여 세션을 다른 곳에 저장하는 경우 세션 재활용 메커니즘이 만료된 세션 파일을 자동으로 처리하지 못할 수 있습니다. 이때 만료된 세션을 정기적으로 수동(또는 crontab)으로 삭제해야 합니다.

cd /path/to/sessions; find -cmin +24 | xargs rm
로그인 후 복사

PHP의 세션은 만료되지 않습니다

프로그램을 수정하지 않는 것이 가장 좋은 방법입니다. 프로그램을 수정하면 테스트 부서가 매우 우울할 것이므로 시스템 환경 구성을 수정하는 유일한 방법은 실제로 매우 간단합니다. php.ini 설정 파일을 열고 다음과 같이 세 줄을 수정합니다.

1. session.use_cookies

이 값은 1로 설정되며, sessionid를 전달하기 위해 쿠키가 사용됩니다

2. session.cookie_lifetime

SessionID가 저장되는 시간을 나타냅니다. 클라이언트 쿠키에서 기본값은 0입니다. 이는 브라우저가 SessionID를 닫는다는 의미입니다. 이 때문에 PHP 세션을 영구적으로 사용할 수 없습니다. 그럼 우리가 생각하기에 크다고 생각되는 숫자로 설정해 보겠습니다. 999999999는 어떻습니까? 괜찮습니다! 그게 다야.

3. session.gc_maxlifetime

서버 측에 세션 데이터가 저장되는 시간입니다. 이 시간을 초과하면 세션 데이터가 자동으로 삭제됩니다. 그럼 99999999로 설정해 보겠습니다.

그렇습니다. 물론 믿을 수 없다면 테스트해보고 확인하세요. 세션을 설정하고 10일 반 후에 다시 와서 컴퓨터가 작동하지 않는지 확인하세요. 전원이 꺼졌거나 꺼진 경우에도 세션 ID를 볼 수 있습니다.

물론 서버를 제어할 권한이 없고 php.ini 설정을 수정하는 것이 나만큼 운이 좋지 않을 수도 있습니다. 물론 우리는 스스로 의존할 수 있습니다. , 쿠키를 저장하려면 클라이언트를 사용해야 합니다. 획득한 sessionID는 클라이언트의 쿠키에 저장되고 이 쿠키의 값을 설정한 다음 이 값을 session_id() 함수에 전달합니다.

<?php
session_start(); // 启动Session
$_SESSION[&#39;count&#39;]; // 注册Session变量Count
isset($PHPSESSID)?session_id($PHPSESSID):$PHPSESSID = session_id();
// 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID
$_SESSION[&#39;count&#39;]++; // 变量count加1
setcookie(&#39;PHPSESSID&#39;, $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中
echo $count; // 显示Session变量count的值
?>
로그인 후 복사


세션 실패는 통과되지 않습니다

먼저 PHP 파일을 작성해 보겠습니다: , 서버의 매개변수 구성을 보려면 이를 서버에 전달합니다.
세션 섹션으로 이동하여 session.use_trans_sid 매개변수가 0으로 설정되어 있는지 확인하세요.
이 매개변수는 투명한 SID 지원 활성화 여부, 즉 세션이 URL과 함께 전달되는지 여부를 지정합니다. 개인적으로 이해하기로는 이 매개변수를 0으로 설정하면 각 URL에 대해 세션이 열립니다. 이러한 방식으로 후속 페이지는 이전 페이지의 세션을 추적할 수 없으며, 이를 전달할 수 없다고 합니다. 두 페이지는 서버 측에 두 개의 세션 파일을 생성하며 관련이 없습니다. (여기서 정확한 원리는 확인이 필요합니다)
그래서 한 가지 방법은 구성 파일 php.ini에서 session.use_trans_sid 값을 1로 변경하는 것입니다.

물론 모든 사람이 PHP 구성을 변경할 권한이 있는 것은 아니라는 것을 알고 있습니다. 그렇다면 간접적인 해결책은 무엇입니까?
두 가지 예를 사용하여 설명합니다.
파일 1 test1.php

<?php
//表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//将session的name赋值为Havi
$_SESSION[&#39;name&#39;]="Havi";
//输出session,并设置超链接到第二页test2.php
echo "<a href="test2.php" rel="external nofollow" >".$_SESSION[&#39;name&#39;]."</a>";
?>
로그인 후 복사


파일 2: test2.php

<?php
表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//输出test1.php中传递的session。
echo "This is ".$_SESSION[&#39;name&#39;];
?>
로그인 후 복사


所以,重点是在session_start();前加上session_id(SID);,这样页面转换时,服务器使用的是用户保存在服务器session文件夹里的session,解决了传递的问题。
不过有朋友会反映说,这样一来,多个用户的session写在一个SID里了,那Session的价值就发挥不出来了。所以还有一招来解决此问题,不用加session_id(SID);前提是你对服务器的php.ini有配置的权限:
output_buffering改成ON,道理就不表了。
第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:

session.save_path: var/tmp
로그인 후 복사


所以就是检查下var/tmp文件夹是否可写。
写一个文件:test3.php来测试一下:

<?php
echo var_dump(is_writeable(ini_get("session.save_path")));
?>
로그인 후 복사


如果返回bool(false),证明文件夹写权限被限制了,那就换个文件夹咯,在你编写的网页里加入:

//设置当前目录下session子文件夹为session保存路径。
$sessSavePath = dirname(__FILE__).&#39;/session/&#39;;
//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{
session_save_path($sessSavePath);
}
로그인 후 복사

   


更多php中实现精确设置session过期时间的方法相关文章请关注PHP中文网!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!