이 글에서는 주로 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['last_access'])||(time()-$_SESSION['last_access'])>60) $_SESSION['last_access'] = time(); ?>
설정하기만 하면 됩니다. 만료된 값은 프로그램에서 수행할 수도 있습니다:
<?php unset($_SESSION['last_access']);// 或 $_SESSION['last_access']=''; ?>
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['count']; // 注册Session变量Count isset($PHPSESSID)?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的值 ?>
세션 실패는 통과되지 않습니다
我们先写个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
<?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>"; ?>
文件2: test2.php
<?php 表明是使用用户ID为标识的session session_id(SID); //启动session session_start(); //输出test1.php中传递的session。 echo "This is ".$_SESSION['name']; ?>
所以,重点是在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__).'/session/'; //如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。 if(is_writeable($sessSavePath) && is_readable($sessSavePath)) { session_save_path($sessSavePath); }
相关推荐:
PHP 中cookie 和session的联系以及session配置
위 내용은 PHP에서 세션 만료 시간을 정확하게 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!