이 기사의 예에서는 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의 작동 원리를 이해하면 기본적으로 각 서버가 동일한 클라이언트를 공유한다는 것을 알 수 있습니다. 예를 들어 동일한 사용자 브라우저의 경우 서버 A에서 생성된 SESSION ID는 30de1e9de3192ba6ce2992d27a1b6a0a이고, 서버 B에서 생성된 SESSION ID는 c72665af28a8b14c0fe11afe3b59b51b입니다. 또한, PHP의 SESSION 데이터는 본 서버의 파일 시스템에 별도로 저장됩니다.
문제를 파악한 후 문제 해결을 시작할 수 있습니다. SESSION 데이터를 공유하려면 두 가지 목표를 달성해야 합니다. 하나는 동일한 클라이언트에 대해 각 서버에서 생성한 SESSION ID가 동일해야 하며 동일한 COOKIE를 통해 전달될 수 있어야 한다는 것입니다. 동일한 SESSION ID를 읽습니다. PHPSESSID라는 쿠키는 모든 서버에서 액세스할 수 있는 SESSION 데이터의 저장 방법/위치입니다. 간단히 말해서 여러 서버가 클라이언트의 SESSION ID를 공유하고 서버의 SESSION 데이터도 공유해야 합니다.
첫 번째 목표의 구현은 실제로 매우 간단합니다. COOKIE의 도메인을 특별히 설정하기만 하면 됩니다. 기본적으로 COOKIE의 도메인은 현재 서버의 도메인 이름/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 프레임워크를 기반으로 하는 모든 분들의 PHP 프로그래밍에 도움이 되기를 바랍니다.
Memcache를 사용하여 여러 도메인 이름으로 세션 데이터를 공유하는 thinkPHP 구현 방법에 대한 자세한 내용은 PHP 중국어 웹사이트를 참고하세요!