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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-05-16 20:39:56
원래의
881명이 탐색했습니다.

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

이를 위해 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 프로그램에서 설정하는 것입니다.

<&#63;php
if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60)
$_SESSION['last_access'] = time();
&#63;>

로그인 후 복사

만료된 값을 설정하려면 프로그램에서 설정할 수도 있습니다.

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

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

session.gc_maxlifetime 세션 만료는 작은 확률 이벤트인 것으로 나타났습니다. Session.gc_probability 및 session.gc_divisor는 세션에서 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 요청마다 한 번의 재활용이 발생한다"고 간단히 이해하면 됩니다. 이 확률은 다음 매개변수에 의해 제어됩니다
#확률은 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의 세션은 만료되지 않습니다

프로그램을 수정하지 않는 것이 가장 좋은 방법입니다. 프로그램을 수정하면 테스트 부서가 매우 우울해지기 때문에 시스템 환경 구성만 수정하면 됩니다. 실제로는 매우 간단합니다. 설정 파일을 열고 다음 세 줄을 수정합니다.

1. session.use_cookies

이 값을 1로 설정하고 쿠키를 사용하여 세션 ID를 전달합니다

2. session.cookie_lifetime

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

3. session.gc_maxlifetime

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

그렇습니다. 물론 믿을 수 없다면 테스트해 보세요. 세션을 설정하고 10일 반 후에 컴퓨터가 정전되지 않으면 다시 오세요. 또는 충돌이 발생하더라도 여전히 이 세션 ID를 볼 수 있습니다.

물론 서버를 제어할 권한이 없고 php.ini 설정을 수정할 수 있는 운이 좋지 않은 경우도 물론 있습니다. , 클라이언트를 사용하여 쿠키를 저장하고, 얻은 sessionID를 사용하여 클라이언트의 쿠키에 저장하고, 이 쿠키의 값을 설정한 후, 이 값을 session_id() 함수에 전달해야 합니다.

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

로그인 후 복사

session失效不传递

我们先写个php文件:<?=phpinfo()?>, 传到服务器去看看服务器的参数配置。
转到session部分,看到session.use_trans_sid参数被设为了零。
这个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个session文件,且无关联。(此处精确原理有待确认)
所以一个办法是在配置文件php.ini里把session.use_trans_sid的值改成1。

当然我们知道,不是谁都有权限去改php的配置的,那么还有什么间接的解决办法呢?
下面就用两个实例来说明:
文件1 test1.php

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

文件2: test2.php

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

所以,重点是在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来测试一下:

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

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

//设置当前目录下session子文件夹为session保存路径。
$sessSavePath = dirname(__FILE__).'/session/';
//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{
session_save_path($sessSavePath);
}
로그인 후 복사
관련 라벨:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿