현재 위치: > 최신 기사 목록> SessionIdInterface를 통해 기본 세션 저장 메커니즘을 변경하는 방법은 무엇입니까?

SessionIdInterface를 통해 기본 세션 저장 메커니즘을 변경하는 방법은 무엇입니까?

M66 2025-07-04

PHP의 세션 관리는 웹 개발의 매우 중요한 부분이며 개발자에게 사용자 세션 데이터를 저장하고 관리 할 수있는 기능을 제공합니다. 기본적으로 PHP는 파일을 사용하여 세션 데이터를 저장하지만, 경우에 따라 개발자는 데이터베이스, 캐시 시스템 등과 같은 다른 곳에 세션 데이터를 저장하기를 원할 수도 있습니다.이 사용자 지정 스토리지 메커니즘을 구현하기 위해 PHP는 SessionIdInterface 인터페이스를 제공하여 세션을 저장하는 방식을 유연하게 제어 할 수 있습니다.

1. SessionIdInterface를 이해하십시오

SessionIdInterface 는 PHP 버전 7.4에 도입 된 인터페이스로, 개발자가 세션의 ID 생성 및 스토리지 메커니즘을 사용자 정의 할 수있는 방법을 제공하는 것을 목표로합니다. 일반적으로 PHP 세션의 ID는 PHP에 의해 내부적으로 자동으로 생성되며 $ _session 에 저장됩니다. SessionIdInterface를 구현하여 개발자는 세션 ID의 획득 및 스토리지 방법을 사용자 정의 할 수 있습니다.

특히 SessionIdInterface는 두 가지 주요 방법을 제공합니다.

  • getSessionID () : 현재 세션의 ID를 얻는 데 사용됩니다.

  • setsessionId (String $ id) : 세션 ID를 설정하는 데 사용됩니다.

이 두 가지 방법을 구현함으로써 개발자는 세션 ID가 생성, 저장 및 스토리지에서 읽는 방법을 제어 할 수 있습니다.

2. SessionIdInterface를 통해 세션 스토리지 메커니즘을 변경하십시오

기본 세션 저장 메커니즘을 변경하려면 SessionHandlerInterface를 구현하고 SessionIdInterface를 결합하여 새로운 스토리지 방법을 제공하는 사용자 정의 세션 핸들러 클래스를 구현해야합니다. 다음은 데이터베이스를 사용하여 세션 데이터를 저장하는 방법을 보여주는 간단한 예입니다.

1 단계 : 사용자 정의 세션 핸들러를 만듭니다

먼저 SessionHandlerInterfaceSessionIdInterface 를 구현하는 클래스를 만들어야합니다. 이 클래스는 세션 데이터의 저장 및 획득을 처리하는 데 사용됩니다.

 <span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">DatabaseSessionHandler</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">SessionHandlerInterface</span></span><span>, </span><span><span class="hljs-title">SessionIdInterface</span></span><span>
{
    </span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$db</span></span><span>;

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$dbConnection</span></span></span><span>)
    {
        </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db = </span><span><span class="hljs-variable">$dbConnection</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">open</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$savePath</span></span></span><span>, </span><span><span class="hljs-variable">$sessionName</span></span><span>)
    {
        </span><span><span class="hljs-comment">// 여기에서 데이터베이스 연결 확인 및 기타 작업을 수행 할 수 있습니다.</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">close</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
    {
        </span><span><span class="hljs-comment">// 데이터베이스 연결을 닫습니다</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">read</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// 데이터베이스에서 세션 데이터를 읽습니다</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT session_data FROM sessions WHERE session_id = :session_id"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_id'</span></span><span>, </span><span><span class="hljs-variable">$sessionId</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
        
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetchColumn</span></span><span>();
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">write</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>, </span><span><span class="hljs-variable">$sessionData</span></span><span>)
    {
        </span><span><span class="hljs-comment">// 세션 데이터를 데이터베이스에 쓰십시오</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"REPLACE INTO sessions (session_id, session_data) VALUES (:session_id, :session_data)"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_id'</span></span><span>, </span><span><span class="hljs-variable">$sessionId</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_data'</span></span><span>, </span><span><span class="hljs-variable">$sessionData</span></span><span>);
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">destroy</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// 데이터베이스에서 세션 데이터를 삭제합니다</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"DELETE FROM sessions WHERE session_id = :session_id"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_id'</span></span><span>, </span><span><span class="hljs-variable">$sessionId</span></span><span>);
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">gc</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$maxlifetime</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// 만료 된 세션을 정리하십시오</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"DELETE FROM sessions WHERE last_access &lt; :maxlifetime"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':maxlifetime'</span></span><span>, </span><span><span class="hljs-variable">$maxlifetime</span></span><span>);
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
    }

    </span><span><span class="hljs-comment">// 성취하다 SessionIdInterface 인터페이스 방법</span></span><span>
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getSessionId</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
    {
        </span><span><span class="hljs-comment">// 맞춤 액세스 Session ID 방법</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">session_id</span></span><span>();  </span><span><span class="hljs-comment">// 또는 사용자 정의 로직 생성 ID</span></span><span>
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">setSessionId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$id</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// 사용자 정의 설정 Session ID 방법</span></span><span>
        </span><span><span class="hljs-title function_ invoke__">session_id</span></span><span>(</span><span><span class="hljs-variable">$id</span></span><span>);  </span><span><span class="hljs-comment">// 또는 사용자 정의 로직 저장 ID</span></span><span>
    }
}
</span></span>

2 단계 : 사용자 정의 세션 핸들러를 등록하십시오

PHP에서는 session_set_save_handler () 함수를 통해 사용자 정의 세션 프로세서를 등록해야합니다. 이러한 방식으로 PHP는 맞춤형 클래스를 사용하여 세션의 저장 및 읽기를 처리합니다.

 <span><span><span class="hljs-comment">// 가정 $dbConnection 효과적입니다 PDO 데이터베이스 연결 객체</span></span><span>
</span><span><span class="hljs-variable">$handler</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DatabaseSessionHandler</span></span><span>(</span><span><span class="hljs-variable">$dbConnection</span></span><span>);

</span><span><span class="hljs-comment">// 사용자 정의 세션 프로세서를 등록하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_set_save_handler</span></span><span>(
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'open'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'close'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'read'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'write'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'destroy'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'gc'</span></span><span>]
);

</span><span><span class="hljs-comment">// 세션을 시작하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span></span>

3 단계 : 세션을 시작하고 사용합니다

이제 PHP 세션 데이터는 기본 파일 시스템 대신 데이터베이스에 저장됩니다. 평소와 같이 $ _session 변수를 사용하여 세션 데이터에 액세스 할 수 있습니다.

 <span><span><span class="hljs-comment">// 세션 데이터를 설정합니다</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>] = </span><span><span class="hljs-string">'John Doe'</span></span><span>;

</span><span><span class="hljs-comment">// 세션 데이터를 얻습니다</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>];  </span><span><span class="hljs-comment">// 산출 John Doe</span></span><span>
</span></span>

3. 요약

SessionIdInterfaceSessionHandlerInterface 인터페이스를 구현함으로써 개발자는 PHP의 세션 저장 메커니즘을 유연하게 사용자 정의 할 수 있으며 더 이상 파일 시스템 또는 PHP의 기본 저장소에 의존하지 않을 수 있습니다. 데이터베이스 또는 캐시 시스템에 저장하든 Metro 세션 관리는보다 효율적이고 유연 할 수 있습니다. 동시에, 이것은 또한 시스템의 확장 성을 향상시키고 다른 응용 프로그램 시나리오에 적응할 수 있습니다.

세션 스토리지 방법을 사용자 정의함으로써 세션 데이터 스토리지의 위치를 ​​제어 할뿐만 아니라 세션 ID의 생성, 저장 및 읽기에 대한 세부적인 제어를 제공하여보다 복잡한 비즈니스 요구를 충족시킬 수 있습니다.