이 기사의 예에서는 memcache를 사용하여 thinkPHP의 세션 데이터를 여러 도메인 이름과 공유하는 구현 방법을 설명합니다. 참고하실 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.
1. 문제의 원인
약간 큰 웹사이트에는 일반적으로 여러 개의 서버가 있습니다. 각 서버는 서로 다른 기능을 가진 모듈을 실행하고 서로 다른 2차 도메인 이름을 사용합니다. 그러나 포괄적인 웹사이트의 경우 사용자 시스템이 통합되어 있습니다. 전체 웹사이트의 모든 모듈에 로그인하는 데 사용됩니다. 각 서버가 사용자 데이터를 공유하는 것은 상대적으로 쉽습니다. 백엔드에 데이터베이스 서버를 배치하기만 하면 각 서버는 통합된 인터페이스를 통해 사용자 데이터에 액세스할 수 있습니다. 그러나 여전히 문제가 있습니다. 즉, 사용자가 이 서버에 로그인한 후 다른 서버의 다른 모듈에 들어갈 때 다시 로그인해야 합니다. 이는 일회성 로그인이며 모든 일반적인 문제는 다음과 매핑됩니다. 실제로는 다양한 서버 간에 SESSION 데이터를 공유하는 방법입니다.
2. PHP SESSION 작동 방식
문제를 해결하기 전에 먼저 PHP SESSION의 작동 방식을 이해해 보겠습니다. 클라이언트(예: 브라우저)가 웹 사이트에 로그인하면 방문한 PHP 페이지는 session_start()를 사용하여 SESSION을 열 수 있으며, 이는 클라이언트의 고유 식별 SESSION ID를 생성합니다(이 ID는 session_id 함수를 통해 얻거나 설정할 수 있음) ()). 세션 ID는 두 가지 방법으로 클라이언트에 유지될 수 있습니다. 따라서 다른 페이지를 요청할 때 PHP 프로그램은 클라이언트의 세션 ID를 학습할 수 있습니다. 하나는 기본적으로 세션 ID를 GET URL 또는 POST 양식에 자동으로 추가하는 것입니다. 아래에서 변수 이름은 PHPSESSID이고, 다른 하나는 COOKIE를 통해 SESSION ID를 저장하는 것입니다. 기본적으로 이 COOKIE의 이름은 PHPSESSID입니다. 여기서는 COOKIE 방식이 널리 사용되기 때문에 설명을 위해 주로 사용합니다.
그럼 SESSION 데이터는 어디에 저장되나요? 물론 서버 측에서는 메모리에 저장하는 대신 파일이나 데이터베이스에 저장됩니다. 기본적으로 php.ini에 설정된 SESSION 저장 방식은 파일(session.save_handler = files) 즉, SESSION 데이터는 파일을 읽고 쓰는 방식으로 저장되며, SESSION 파일이 저장되는 디렉터리는 세션별로 지정됩니다. save_path이며 파일 이름은 접두사 sess _로 시작하고 그 뒤에 SESSIONID가 옵니다(예: sess_c72665af28a8b14c0fe11afe3b59b51b). 파일의 데이터는 직렬화 후의 SESSION 데이터입니다. 액세스량이 많은 경우 더 많은 SESSION 파일이 생성될 수 있습니다. 이 경우 SESSION 파일을 저장하기 위한 계층적 디렉터리를 설정하면 효율성이 크게 향상됩니다. session.save_path=" N;/save_path", N은 계층적입니다. 레벨, save_path는 시작 디렉터리입니다. SESSION 데이터를 쓸 때 PHP는 클라이언트의 SESSION_ID를 얻은 다음 이 SESSION ID를 사용하여 지정된 SESSION 파일 저장 디렉터리에서 해당 SESSION 파일을 찾습니다. 존재하지 않는 경우 이를 생성하고 마지막으로 데이터를 직렬화하여 씁니다. 파일. SESSION 데이터를 읽는 것도 비슷한 작업 프로세스입니다. 읽은 데이터를 역직렬화해야 하며 해당 SESSION 변수가 생성됩니다.
3. 다중 서버 공유의 주요 장애물과 해결책 SESSION
SESSION의 작동 원리를 이해하면 기본적으로 각 서버가 동일한 클라이언트에 대해 각각 SESSION ID를 생성한다는 것을 알 수 있습니다. 예를 들어 동일한 사용자 브라우저의 경우 서버 A에서 생성된 SESSION ID는 30de1e9de3192ba6ce2992d27a1b6a0a입니다. 서버 B는 c72665af28a8b14c0fe11afe3b59b51b를 생성합니다. 또한, PHP의 SESSION 데이터는 본 서버의 파일 시스템에 별도로 저장됩니다.
문제를 파악한 후 문제 해결을 시작할 수 있습니다. SESSION 데이터를 공유하려면 두 가지 목표를 달성해야 합니다. 하나는 동일한 클라이언트에 대해 각 서버에서 생성한 SESSION ID가 동일해야 하며 동일한 COOKIE를 통해 전달될 수 있어야 한다는 것입니다. 동일한 SESSION ID를 읽습니다. PHPSESSID라는 쿠키는 모든 서버에서 액세스할 수 있는 SESSION 데이터의 저장 방법/위치입니다. 간단히 말해서 여러 서버가 클라이언트의 SESSION ID를 공유하고 서버의 SESSION 데이터도 공유해야 합니다.
첫 번째 목표의 구현은 실제로 매우 간단합니다. 기본적으로 쿠키의 도메인은 현재 서버의 도메인 이름/IP 주소입니다. 서로 다르므로, 각 서버에서 설정한 COOKIE는 서로 접근할 수 없습니다. 예를 들어 www.aaa.com 서버는 www.bbb.com 서버에서 설정한 COOKIE를 읽거나 쓸 수 없습니다. 여기서 이야기하고 있는 동일한 웹사이트의 서버는 고유한 특성을 가지고 있습니다. 즉, 동일한 1차 도메인에 속합니다. 예를 들어 Tieba.xiaoyuan.com과 www.xiaoyuan.com은 모두 .xiaoyuan 도메인에 속합니다. .com, 그런 다음 COOKIE의 도메인을 .xiaoyuan.com으로 설정하여 Tieba.xiaoyuan.com, www.xiaoyuan.com 등이 이 COOKIE에 액세스할 수 있도록 할 수 있습니다. PHP 코드에서의 설정 방법은 다음과 같습니다.
<?php ini_set('session.cookie_domain', '.xiaoyuan.com'); ?>
이렇게 하면 동일한 클라이언트 SESSION ID를 공유하는 각 서버의 목적이 달성됩니다.
두 번째 목표는 파일 공유를 사용하여 달성할 수 있습니다. 해결 방법에는 두 가지가 있는데, 하나는 데이터 저장 세션을 사용하는 것이고, 다른 하나는 Memcache를 사용하는 것입니다. 여기서는 MEMCACHE를 이용하여 해결해보세요.
이미 세션에 대한 Memcache 액세스를 지원하는 thinkphp 프레임워크를 사용합니다. memcache 서버를 설정한 후 구성 파일에 memcache의 IP와 포트만 설정하고 COOKIE_DOMAIN 매개변수를 지정하면 됩니다. 버튼을 누르세요. 세션을 정상적으로 운영하세요. 이제 여러 도메인 이름으로 세션을 공유할 수 있습니다.
더 많은 thinkPHP 관련 컨텐츠에 관심이 있는 독자는 이 사이트의 특별 주제인 "ThinkPHP 시작 튜토리얼", "ThinkPHP 템플릿 작동 기술 요약", "ThinkPHP 공통 메소드 요약", "Smarty 템플릿 기본 튜토리얼"을 확인할 수 있습니다. 및 "PHP 템플릿 기술 요약".
이 기사가 ThinkPHP 프레임워크를 기반으로 하는 모든 사람의 PHP 프로그래밍에 도움이 되기를 바랍니다.