티스토리 뷰
php.ini 을 수정하기 위한 준비
현재 php 버전을 확인하기 위해서 직접 웹서버에 아래 코드를 실행하는 방법이 가장 빠르다.
<?php
echo phpversion();
결과)
7.0.31-1+ubuntu16.04.1+deb.sury.org+1
<?php
echo phpinfo();
결과)
php.ini 설정하기
터미널에서
root@ubuntu:/# find -name php.ini
./root/php.ini
./etc/php/7.1/cli/php.ini
./etc/php/7.1/apache2/php.ini
./etc/php/7.0/cli/php.ini
./etc/php/7.0/fpm/php.ini
나오는데 cli 버전이 아니라 fpm 으로 사용하고 있으니
./etc/php/7.0/fpm/php.ini 파일을 열어서 다음의 세션 정보들을 참조하여 설정하도록 한다.
session 값 목록
// 기본값이 Files, session_module_name() 을 통하여 정보확인 가능
session.save_handler = files
// 세션 파일 저장 경로
session.save_path = /tmp
// 세션과 함께 쿠키 사용여부
session.use_cookies = 1 [ 0 Off / On ]
// 세션 ID를 쿠키에 저장한 경우 PHP에서 세션 ID를 확인하기 위한 변수명
session.name = PHPSESSID
// php 시작과 동시에 세션이 자동으로 스타트 되도록 함
session.auto_start = 0
// 세션 ID를 저장한 쿠키의 유효시간
session.cookie_lifetime = 0 (기본값 : 브라우저 종료되면 자동으로 쿠키값 삭제)
// 세션ID가 저장된 쿠키가 적용될 디렉토리
session.cookie_path = /
// 사용되지 않는 것으로 보이는 세션 데이터 삭제 (단위 : 초)
session.gc_maxlifetime = 1440
// 서버에 저장된 세션 ID의 활성화 시간 (단위: 분)
// : 클라이언트에서 브라우저 닫을경우 서버에서는 클라이언트 연졀중인지 아닌지 확인 방법없으므로
// 미리 세션데이터를 삭제하고 세션ID는 180분 이후에 삭제시킨다.
// 만약 세션 ID를 삭제하지 않으려면 php.ini 를 수정하여 시간을 늘려주면 된다.
session.cache_expire = 180
http://ir2.php.net/manual/kr/session.configuration.php
session 시간설정에 대한 추가설명과 실제 적용
브라우저 종료되면 자동으로 쿠키값 삭제하는 설정
기본값은 0이고 단위는 초이다
session_cookie_lifetime = 0
공식 문서에도 설명이 자세하지는 않은데..
웹 페이지 요청이 있을때 그 시점부터 시간이 갱신되고, 페이지 요청이 없는 시간이 지속되면 세션데이터를 삭제하는 옵션이다. 클라이언트에서는 브라우저가 닫힌 경우를 알 수없으므로 동작이 없는 경우 세션캐시 만료(삭제)한다.
기본값은 180이고 단위는 분 이다
session_cache_expire = 60min * 1hour * 6hour = 360 // 6시간
위에서 cache_expire 와는 전혀 다른 개념이다.
cache_expire에서 사용되지 않는 세션에 대한 데이터(만약 기본값이 files 였다면 실제 파일)를 물리적으로 삭제한다. 삭제되는 타이밍은 세션이 시작될때 삭제된다.
기본값은 1440 이고(24분) 초 단위이다
session.gc_maxlifetime = 60sec * 60min * 6hour = 21,600 //6시간
기 로그인된 세션 삭제 코드작성
직접 세션 경로를 지정해줘도 되고 session_save_path() 함수로 가져와도 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | <?php // 2019.02.19 serpiko@hanmail.net define("_DIR", "/var/lib/php/sessions"); define("_SESSION_TOKEN", "_"); define("_SESSION_PREFIX", "sess"); $user_session = "e1bb6c06665be33c0c56cc9de223d621"; $user_idx = 72; // 디렉토리 여부 if( is_dir(_DIR) ){ // 파일존재 여부 if( file_exists(_DIR) ) { // 디렉토리 open if( $handle = opendir(_DIR) ){ // 디렉토리 안 파일접근 while( false !== ($entry = readdir($handle) ) ){ if( "file" == strtolower( filetype(_DIR."/".$entry) ) ){ $when_explode = explode(_SESSION_TOKEN, $entry); $extract_prefix = strtolower($when_explode[0]); $extract_postfix = $when_explode[1]; if( _SESSION_PREFIX == $extract_prefix ){ if( $user_session == $extract_postfix ){ $fp = fopen(_DIR."/".$entry, 'r'); while( !feof($fp) ){ // 메모리 length가 1024로는 짧네.. $content = fread($fp, 1024*2); flush(); } fclose($fp); if( strstr($content, (string)$user_idx) ){ unlink(_DIR."/".$entry); } } } } } } } closedir($handle); } <?php // 2019.02.19 serpiko@hanmail.net namespace App\Auth; use App\Models\Eloquent\User; class Session { // protected $container; const _DIR = session_save_path(); const _SESSION_TOKEN = "_"; const _SESSION_PREFIX = "sess"; private $entry; public function __construct($container) { } public function isExistSession(){ // 디렉토리 여부 if( is_dir(self::_DIR) ){ // 파일존재 여부 if( file_exists(self::_DIR) ) { // 디렉토리 open if( $handle = opendir(self::_DIR) ){ // 디렉토리 안 파일접근 while( false !== ($entry = readdir($handle) ) ){ if( "file" == strtolower( filetype(self::_DIR."/".$entry) ) ){ $when_explode = explode(self::_SESSION_TOKEN, $entry); $extract_prefix = strtolower($when_explode[0]); $extract_postfix = $when_explode[1]; if( self::_SESSION_PREFIX == $extract_prefix ){ if( session_id() == $extract_postfix ){ $fp = fopen(self::_DIR."/".$entry, 'r'); while( !feof($fp) ){ // 메모리 length가 1024로는 짧네.. $content = fread($fp, 1024*2); flush(); } fclose($fp); if( strstr($content, (string)$_SESSION['user_idx']) ){ //unlink(self::_DIR."/".$entry); $this->entry = $entry; return true; } } } } } } } closedir($handle); } return false; } public function unlinkSession(){ if( !unlink(self::_DIR."/".$this->entry) ){ $result = "FAIL"; }else{ $result = "SUCCESS"; } // [ logs/app.log ] $this->container->logger->info(" ================ START ================="); $this->container->logger->info("/ slimapp '/' Auth\Session result[ ". $result ." ]"); $this->container->logger->info("| slimapp '/' Auth\Session session_id[ ". session_id() ." ]"); $this->container->logger->info("| slimapp '/' Auth\Session session_org_id[ ". User::select('session_org_id')->where('user_idx',$_SESSION['user_idx'])->get() ." ]"); $this->container->logger->info("| slimapp '/' Auth\Session user_idx[ ". $_SESSION['user_idx'] ." ]"); $this->container->logger->info("\ slimapp '/' Auth\Session execute time[ ". date("Y-m-d H:i:s") ." ]"); $this->container->logger->info(" ================ END ================="); } } | cs |
'■ 백엔드 ■ > PHP' 카테고리의 다른 글
AWS SDK for PHP (0) | 2020.05.14 |
---|---|
ajax 413 Request Entity Too Large error (0) | 2018.12.07 |
PDO SQL 인젝션을 막기위한 처리 (0) | 2018.11.22 |
PDO Tutorial for MySQL Developers (0) | 2018.11.22 |
PhpSpreadsheet (2) | 2018.07.26 |