■ 백엔드 ■/PHP2019.02.19 22:43

   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) ){
            
            // 디렉토리 안 파일접근
            whilefalse !== ($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($fp1024*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) ){
                    
                    // 디렉토리 안 파일접근
                    whilefalse !== ($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];
                            
                            ifself::_SESSION_PREFIX == $extract_prefix ){
                                
                                if( session_id() == $extract_postfix ){
                                    
                                    $fp = fopen(self::_DIR."/".$entry'r');
                                
                                    while!feof($fp) ){
                                        // 메모리 length가 1024로는 짧네..
                                        $content = fread($fp1024*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


Posted by SAP (Study And Programming) by serpiko

댓글을 달아 주세요