>백엔드 개발 >PHP 튜토리얼 >PHP에서 세션 만료 시간을 정확하게 설정하는 방법

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

不言
不言원래의
2018-06-06 11:15:542364검색

이 글에서는 주로 PHP에서 세션 만료 시간을 정확하게 설정하는 방법을 소개합니다. 필요하신 분들은 참고하시면 됩니다

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

이와 관련하여 PHP에서 php.ini를 설정하고 session.gc_maxlifetime = 1440을 찾을 수 있습니다. #(PHP5 기본값은 24분)
여기서 만료 시간을 마음대로 설정할 수 있지만 설정한 후에 그렇게 말하는 사람들도 있습니다. , 그것은 작동하는 것 같습니다!
실제로 작동하지 않는 것이 아니라 시스템 기본값 때문입니다:

session.gc_probability = 1
session.gc_pisor = 1000

가비지 수집 가능성이 있습니다. 1000은 세션이 1000번에 한 번만 재활용된다는 의미입니다.
방문량이 많으면 재활용 효과를 얻을 수 있습니다.
또는 session.gc_pisor의 값을
예: session.gc_pisor = 1로 설정하면 확실히 알 수 있습니다. 세션이 만료되었습니다. 효과가 좋습니다.

가장 일반적으로 사용되는 방법은 다음 예제 프로그램과 같이 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에는 만료 메커니즘이 있습니다:

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

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

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

session.gc_probability = 1
session.gc_pisor = 100

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

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

cd /path/to/sessions; find -cmin +24 | xargs rm

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

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

1, 세션 .use_cookies

이 값을 1로 설정하고 쿠키를 사용하여 sessionid

2, session.cookie_lifetime

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

3.session.gc_maxlifetime

이 시간을 초과하면 세션 데이터가 자동으로 삭제됩니다. 그럼 99999999로 설정해 보겠습니다.

그렇습니다. 물론 믿을 수 없다면 테스트해 보세요. 세션을 설정하고 컴퓨터에 정전이 발생하지 않거나 10일 반 후에 다시 오세요. 다운타임이 있어도 이 세션 ID를 계속 볼 수 있습니다.

물론, 서버를 제어할 수 있는 권한이 없고 저처럼 php.ini 설정을 수정하지 못할 수도 있습니다. 물론 우리는 php.ini 설정을 사용해야 합니다. 클라이언트의 쿠키로 이동하여 이 쿠키의 값을 설정한 다음 이 값을 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文件:a3358401e79a3858445207450bf7e497, 传到服务器去看看服务器的参数配置。
转到session部分,看到session.use_trans_sid参数被设为了零。
这个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个session文件,且无关联。(此处精确原理有待确认)
所以一个办法是在配置文件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 中cookie 和session的联系以及session配置

위 내용은 PHP에서 세션 만료 시간을 정확하게 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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