session_set_save_handler는 memcached의 세션 저장 방법과 아무 관련이 없습니다
memcached 서버에서
1) memcached를 다운로드합니다
#wget http://memcached.googlecode. com/files /memcached-1.4.15.tar.gz
2) memcached는 libevent에 의존하기 때문에 먼저 libevent 라이브러리를 설치해야 합니다. 여기서는 yum을 직접 설치합니다
#yum install *libevent*
3)memcached 설치
#./configure --prefix=/usr/local/memcached
#make
#make install
4) memcached 시작
#/usr/local/memcached/bin/memcached -d -m 4096 -p 11211 -u root
-d daemon ?-p port -u ?user -m memory
웹 서버에 서버에
5) 웹 서버에 php memcache 모듈 설치
#/usr/local/php/bin/pecl install memcache
Memcache 세션 핸들러 지원을 활성화하시겠습니까? [예] : 예(여기서 예를 선택하세요.)
6) php.ini에 다음 콘텐츠를 추가하세요.
extension=/usr/local/php /lib/php/extensions/no- debug-non-zts-20090626/memcache.so
7) php.ini의 session.save_handler 및 session.save_path를 다음 내용으로 수정합니다.
session.save_handler = memcache
session.save_path = "tcp://memcached 서버 ip:11211"
PHP 프로그램에서도
ini_set('session.save_handler', 'memcache ');
ini_set ('session.save_path', 'tcp://memcached server ip:11211');
참고: 세션을 저장하기 위해 memcached를 사용하는 이 방법은 session_set_save_handler와 아무 관련이 없습니다.
memcached 후 설치 완료
php.ini
session.save_handler를 memcache로 변경하고 save_path를 memcache의 주소와 포트를 가리키도록 수정합니다. memcached
session.save_handler = memcache
session.save_path = tcp://127.0.0.1:11211
Memcache의 PECL 확장은 매우 강력하며 장애 조치 및 분산 스토리지를 지원할 수 있습니다.
사용법은 매우 간단합니다. 다음과 같이 session.save_path 매개변수 목록에서 각 memcached 서버를 쉼표로 구분하면 됩니다.
session.save_path = "tcp://172.16.8.81 : 11211,tcp://172.16.8.82:11211,tcp://172.16.8.83:11211"
저장된 세션은 해시된 후 각 memcached 서버에 저장되며 해시 알고리즘 memcache는 두 가지를 지원합니다. 종, crc32 및 fnv:
memcache.hash_function= {crc32,fnv}
fnv 알고리즘은 문서에서 거의 언급되지 않습니다. crc32보다 해싱이 더 좋다고 합니다. 다음과 같은 소규모 프로그램 실험 후에 crc32 해시 알고리즘이 여전히 더 균등하게 분산되어 있는 것으로 나타났습니다.
<?php ini_set("memcache.hash_function", "crc32"); $memcache = new Memcache; $memcache1 = new Memcache; $memcache2 = new Memcache; $memcache->addServer('localhost', 11211); $memcache->addServer('localhost', 11212); $memcache->flush(); $memcache1->connect('localhost', 11211); $memcache2->connect('localhost', 11212); $fp1 = fopen("mem1.txt", "w"); $fp2 = fopen("mem2.txt", "w"); for ($i = 0; $i < 1000; $i++) { $memcache->set($i, $i, 0, 1000); fwrite($fp1, $memcache1->get($i) . " "); fwrite($fp2, $memcache2->get($i) . " "); } fclose($fp1); fclose($fp2);
그런 다음 세션 저장을 테스트했습니다
테스트를 위해 memcached 프로세스를 3개 열었습니다
<?php ini_set("memcache.hash_function", "fnv"); ini_set("error_reporting", "E_CORE_ERROR"); $memcache1 = new Memcache; $memcache1->connect('localhost', 11211); $memcache1->flush(); $memcache2 = new Memcache; $memcache2->connect('localhost', 11212); $memcache2->flush(); $memcache3 = new Memcache; $memcache3->connect('localhost', 11213); $memcache3->flush(); $fp1 = fopen('mem1.txt', 'w'); $fp2 = fopen('mem2.txt', 'w'); $fp3 = fopen('mem3.txt', 'w'); for ($i = 0; $i < 1000; $i++) { session_start(); $ssid = session_id(); echo $ssid; session_register("id"); $_SESSION["id"] = $ssid; session_write_close(); fwrite($fp1, $memcache1->get($ssid) . ' '); fwrite($fp2, $memcache2->get($ssid) . ' '); fwrite($fp3, $memcache3->get($ssid) . ' '); //session_destroy(); } fclose($fp1); fclose($fp2); fclose($fp3);
이상한 것은 memcached2가 일반적으로 선택되지 않는다는 것입니다. ,
과 1, 3의 내용은 일치합니다. 장애 조치용일 수도 있습니다.
1과 3을 끄면 2에 콘텐츠가 나타나 memcached2가 정상적으로 작동하고 있음을 나타냅니다.
이 현상은 내 해싱 알고리즘이 crc32를 사용하든 fnv를 사용하든 관계없이 존재합니다.
마침내 발견한 것은 이 테스트 프로그램에 문제가 있다는 것입니다.
session_write_close 이후에는 전체 프로그램의 세션이 고유하기 때문입니다.
즉, session_destroy 호출을 포함하여 루프가 여러 번 반복되었지만 반환된 세션 ID는 동일합니다.
이로 인해 두 파일의 내용은 일치하지만 다른 파일에는 내용이 없습니다.
이를 바탕으로
스크립트를 일괄적으로 호출할 수만 있습니다. 다음과 같이 수정하세요.
<?php ini_set("memcache.hash_strategy", "consistent"); ini_set("memcache.hash_function", "crc32"); ini_set("error_reporting", "E_CORE_ERROR"); ini_set("memcache.allow_failover", "0"); $memcache1 = new Memcache; $memcache1->connect('localhost', 10001); $memcache1->flush(); $memcache2 = new Memcache; $memcache2->connect('localhost', 10002); $memcache2->flush(); $memcache3 = new Memcache; $memcache3->connect('localhost', 10003); $memcache3->flush(); $fp1 = fopen("mem1.txt", "a+"); $fp2 = fopen("mem2.txt", "a+"); $fp3 = fopen("mem3.txt", "a+"); session_start(); $ssid = session_id(); echo $ssid . "\n"; session_register("id"); $_SESSION["id"] = $ssid; //session_destroy(); session_write_close(); fwrite($fp1, $memcache1->get($ssid) . " "); fwrite($fp2, $memcache2->get($ssid) . " "); fwrite($fp3, $memcache3->get($ssid) . " "); session_destroy(); fclose($fp1); fclose($fp2); fclose($fp3);
그런 다음 셸에서 여러 번 실행하면 반환된 ID가 다릅니다.
mem*.txt 파일을 열어서 확인해 보세요.
3개의 파일 중 각 세션이 2개의 파일에 저장되어 배포 방식이 다른 것으로 확인됩니다.
이것은 Memcache가 세션을 저장하는 데 사용된다는 것을 증명합니다. 하나는 장애 조치를 달성하는 것이고, 두 번째는 해시 분산을 수행하고 세션 ID에 따라 저장하는 것입니다.