PHP에서 세션 시간 초과를 변경하는 방법
세션 타임아웃을 php로 연장하고 싶다.
php.ini 파일을 수정하면 가능한 것으로 알고 있습니다.하지만 나는 그것에 접근할 수 없다.
그럼 php 코드만으로 할 수 있는 건가요?
세션 타임아웃은 엄밀한 보증을 필요로 하는 경우 코드로 구현해야 하는 개념입니다.그것만이 X분간의 비활성화 후에 세션이 존속하지 않는다는 것을 확실히 할 수 있습니다.
이 요건을 조금 완화할 수 있고 기간 제한을 엄격히 하는 대신 하한을 설정해도 문제가 없다면 커스텀 로직을 작성하지 않고도 쉽게 할 수 있습니다.
쾌적한 환경에서의 편리성: 방법과 이유
세션이 쿠키(아마도 쿠키)로 구현되어 클라이언트가 악의적이지 않은 경우 특정 파라미터를 조정하여 세션 기간의 상한을 설정할 수 있습니다.쿠키와 함께 PHP의 기본 세션 처리를 사용하는 경우, 와 함께 다음과 같이 설정할 수 있습니다.
// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);
// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);
session_start(); // ready to go!
이 방법은 세션 데이터를 적어도1시간 동안 비활성 상태로 유지하도록 서버를 설정하고 동일한 시간 범위 후에 세션 ID를 "잊어버리도록" 지시함으로써 작동합니다.기대한 결과를 얻으려면 이 두 단계가 모두 필요합니다.
1시간 후에 세션 ID를 잊어버리도록 클라이언트에 지시하지 않으면(또는 클라이언트가 악의적으로 사용자의 지시를 무시하도록 선택한 경우), 클라이언트는 계속 같은 세션 ID를 사용하며 유효 기간은 결정적이지 않습니다.이는 서버 측에서 수명이 만료된 세션이 즉시 수집되지 않고 세션 GC가 시작될 때만 수집되기 때문입니다.
GC는 잠재적으로 비용이 많이 드는 프로세스이기 때문에 일반적으로 가능성은 다소 작거나 심지어 0입니다(많은 수의 조회수를 얻는 웹사이트는 확률론적 GC를 완전히 무시하고 X분마다 백그라운드에서 실행되도록 일정을 잡습니다).클라이언트라고 ) 은 「」(「」)이 .
session.gc_maxlifetime
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.「 를 선택합니다.
session.gc_maxlifetime
같은 시간 범위에 도달하면 서버는 아이돌세션 데이터를 그보다 빨리 폐기할 수 있습니다.이 경우 세션 ID를 기억하고 있는 클라이언트는 세션 ID를 표시하지만 서버는 해당 세션과 관련된 데이터를 찾지 못해 세션이 막 시작된 것처럼 효과적으로 동작합니다.
중요한 환경에서의 확실성
커스텀 로직을 사용하여 세션 비액티비티 상한을 설정함으로써 완전히 제어할 수 있습니다.위의 하한과 함께 이 설정이 엄격해집니다.
상한을 나머지 세션 데이터와 함께 저장하여 이 작업을 수행합니다.
session_start(); // ready to go!
$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
// this session has worn out its welcome; kill it and start a brand new one
session_unset();
session_destroy();
session_start();
}
// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;
세션 ID 지속성
지금까지 각 세션 ID의 정확한 값에 대해서는 전혀 관심이 없었습니다.필요한 기간 동안 데이터가 존재해야 한다는 요건뿐입니다. ID를 가 합니다.session_regenerate_id
필요한 경우.
PHP의 기본 세션 처리를 사용하는 경우 모든 플랫폼에서 세션 기간을 안정적으로 변경하는 유일한 방법은 php.ini를 변경하는 것입니다.이는 일부 플랫폼에서는 가비지 컬렉션이 php.ini에서 직접 읽는 특정 시간마다 실행되는 스크립트(cron 스크립트)를 통해 구현되기 때문에 실행 시 변경 시도(예: via 등)가 이루어지기 때문입니다.ini_set()
는 신뢰할 수 없고, 동작하지 않을 가능성이 높습니다.
를 들어 시스템에서는 PHP의 은 "Debian Linux"를 "PHP"로 됩니다.session.gc_probability=0
디폴트 설정에서는, 대신에 /etc/cron.d/php 를 개입시켜 실행됩니다. /etc/cron.d/php 는 XX:09 와 XX:39 에 실행됩니다(즉, 30분마다).이 cron 작업은 설정에 지정된 session.gc_maxlife time보다 오래된 세션을 검색하며 세션이 발견되면 삭제됩니다.그 결과, 이러한 시스템에서는ini_set('session.gc_maxlifetime', ...)
무시됩니다.또, 이 질문에서는, PHP 세션의 타임 아웃이 너무 빨랐기 때문에, 한 호스트에서 OP에 문제가 있었지만, 다른 호스트로 전환하면 문제가 없어집니다.
따라서 php.ini에 액세스할 수 없기 때문에 portable로 하려면 기본 세션 처리를 사용할 수 없습니다.cookie의 라이프 타임을 연장하는 것으로도 충분하다고 생각되지만, 호스트를 바꾸어도 안정적으로 동작하는 솔루션을 필요로 하는 경우는, 다른 방법을 사용할 필요가 있습니다.
사용 가능한 대체 방법은 다음과 같습니다.
Cron 작업이 도달하지 않고 PHP의 내부 가비지 컬렉션만 수행되도록 PHP에 다른 세션(저장) 핸들러를 설정하여 세션을 다른 디렉토리 또는 데이터베이스에 저장합니다.이 옵션은 아마도 다음 기능을 활용할 수 있습니다.
ini_set()
session.gc_maxlife time을 설정하는 것은 좋지만 maxlife time 파라미터는 무시하는 것이 좋습니다.gc()
콜백과 최대 라이프 타임을 스스로 결정합니다.PHP 내부 세션 처리는 완전히 잊고 자신만의 세션 관리를 구현하십시오.에는 주로 두 즉, 변수가 에, 「」, 「」의 메리트가 .
$_SESSION
더 많은 코드가 필요하기 때문에 버그나 보안상의 결함이 발생할 가능성이 높아집니다.가장 중요한 것은 세션 ID 예측 가능성(세션 하이잭 가능성으로 이어짐)을 피하기 위해 암호화로 안전한 랜덤 번호 또는 의사 난수에서 세션 식별자를 생성해야 하며, 이는 PHP를 이식할 수 있는 경우 그리 쉽지 않습니다.주요 장점은 모든 플랫폼에서 일관되게 동작하며 코드를 완전히 제어할 수 있다는 것입니다.이는 예를 들어 phpBB 포럼 소프트웨어(최소 버전 1은 확실치 않습니다)가 채택한 접근법입니다.
의 매뉴얼에는 (1)의 예가 있습니다.이 예는 길지만 세션 기간을 연장하기 위해 필요한 수정 사항을 포함하여 여기서 다시 설명하겠습니다.다음 항목이 포함된 것에 주의해 주세요.session_set_cookie_params()
쿠키 수명도 늘립니다.
<?php
class FileSessionHandler
{
private $savePath;
private $lifetime;
function open($savePath, $sessionName)
{
$this->savePath = 'my_savepath'; // Ignore savepath and use our own to keep it safe from automatic GC
$this->lifetime = 3600; // 1 hour minimum session duration
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
function close()
{
return true;
}
function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}
function write($id, $data)
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime
unlink($file);
}
}
return true;
}
}
$handler = new FileSessionHandler();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');
session_set_cookie_params(3600); // Set session cookie duration to 1 hour
session_start();
// proceed to set and retrieve values by key from $_SESSION
접근법(2)은 더 복잡합니다.기본적으로 모든 세션 기능을 스스로 재실장해야 합니다.여기서는 자세히 설명하지 않겠습니다.
공유 호스팅 서버에 대한 알림 또는 도메인 =에 추가됨
시키려면 , 도메인에 를 할 필요가 이 경우, 「」를 사용합니다.php_value session.save_path folderA/sessionsA
.
root이는 루트 서버에 작성되지 .public_html
외부로부터의 홍보가 금지되어 있습니다. permissions cpanel/folder permissions cpanel/folder permissions cpanel/folder permissions는 정상적으로 동작했습니다.0700
아아아아아아아아아아아아아아아아아...
# Session timeout, 2628000 sec = 1 month, 604800 = 1 week, 57600 = 16 hours, 86400 = 1 day
ini_set('session.save_path', '/home/server/.folderA_sessionsA');
ini_set('session.gc_maxlifetime', 57600);
ini_set('session.cookie_lifetime', 57600);
# session.cache_expire is in minutes unlike the other settings above
ini_set('session.cache_expire', 960);
ini_set('session.name', 'MyDomainA');
전에session_start();
이걸 '아저씨'에 ..htaccess
filename을 클릭합니다.
php_value session.save_path /home/server/.folderA_sessionsA
php_value session.gc_maxlifetime 57600
php_value session.cookie_lifetime 57600
php_value session.cache_expire 57600
php_value session.name MyDomainA
많은 조사와 테스트를 거쳐 공유 cpanel/php7 서버에서는 정상적으로 동작했습니다.감사합니다: NoiS
Plesk 를 사용하고 있는 유저에게 코멘트를 추가하는 것은, PHP 스크립트에서 session.gc_maxlife time 을 설정하는 것은, Plesk 가비지 컬렉션 스크립트가 cron 에서 실행되고 있기 때문에 동작하지 않습니다.
이 문제를 피하기 위해 cron 작업을 매시간에서 매일로 이동하는 다음 링크에 게시된 솔루션을 사용했습니다.위의 상위 답변은 다음과 같습니다.
mv /etc/cron.hourly/plesk-php-cleanuper /etc/cron.daily/
https://websavers.ca/plesk-php-sessions-timing-earlier-expected
놓다를 $_SESSION['login_time'] = time();
이전 인증 페이지로 이동합니다.또한 세션 타임아웃을 확인하는 다른 모든 페이지에는 아래가 표시되어 있습니다.
if(time() - $_SESSION['login_time'] >= 1800){
session_destroy(); // destroy session.
header("Location: logout.php");
die(); // See https://thedailywtf.com/articles/WellIntentioned-Destruction
//redirect if the page is inactive for 30 minutes
}
else {
$_SESSION['login_time'] = time();
// update 'login_time' to the last time a page containing this code was accessed.
}
[Edit] : 이 기능은 다른 투고에서 이미 수정한 내용을 사용하거나 가비지 컬렉션을 비활성화하여 세션 기간을 수동으로 확인하는 경우에만 작동합니다.추가되는 것을 잊지 마세요.die()
일부 스크립트/프로세서에서는 무시될 수 있기 때문에 리다이렉트 후., 「」, 「」와의 파기합니다.session_destroy()
리다이렉트에 의존하는 대신 악의적인 클라이언트나 로봇의 경우 더 나은 옵션이 될 수 있습니다.
아니요. php.ini에 액세스할 수 없는 경우 변경사항이 영향을 미친다고 보장할 수 없습니다.
하지만 상담 시간을 연장할 필요는 없을 것 같습니다.
것것현현현현현현현현있있있있있있있있있있없없없없없없없없없없없없없없없없없없없없없없?
에서 php 수 .ini_set()
.
언급URL : https://stackoverflow.com/questions/8311320/how-to-change-the-session-timeout-in-php
'programing' 카테고리의 다른 글
~x + ~y == ~(x + y)는 항상 거짓입니까? (0) | 2022.10.02 |
---|---|
쿠키와 세션은 무엇이며 서로 어떤 관계가 있습니까? (0) | 2022.10.02 |
스프링 스코프 프록시빈 (0) | 2022.10.02 |
이클립스:자동 포맷의 최대 줄 길이를 설정하시겠습니까? (0) | 2022.10.02 |
문자열을 Array List로 변환하는 방법 (0) | 2022.10.02 |