세션 공유가 필요한 이유는 무엇입니까?
요즘에는 약간 큰 웹사이트에는 기본적으로 www.feiniu.com, search.feiniu.com, member.feiniu.com과 같은 여러 하위 도메인이 있습니다. 로그인 정보, 세션 공유가 이루어져야 합니다. 물론 기본 도메인 이름이 동일해야 한다는 전제가 있습니다.
PHP의 세션 원리는?
클라이언트가 PHP 페이지에 접속하여 session_start를 실행하고 session_id를 생성하는 것이 일반적입니다. 일반적으로 쿠키에 session_id를 저장하고, 세션 내용은 서버에 저장됩니다.
클라이언트 액세스가 다릅니다. 모든 페이지는 session_id를 서버에 전달하고 session_id를 통해 세션 콘텐츠를 얻습니다. (추천 학습: 초보부터 마스터까지 PHP 프로그래밍)
과정은 이러하지만 서버마다 동일한 클라이언트에 대해 서로 다른 session_id를 생성하므로 서버마다 동일한 세션 콘텐츠를 얻을 수 없습니다.
그리고 PHP의 기본 SESSION 데이터는 이 서버의 파일 시스템에 별도로 저장됩니다.
따라서 세션 공유 문제를 해결하려면 두 가지 문제를 해결해야 합니다.
여러 서버가 동일한 session_id를 사용합니다.
这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以 打开PHP.ini, 设置session.cookie_domain = .feiniu.com, 当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");
여러 서버가 동일한 session_id를 사용하여 동일한 세션 콘텐츠에 액세스합니다.
要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的, 一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储。
저장소 엔진을 선택하는 방법은 무엇입니까?
기본 파일 저장소:
这种方式的session销毁依托于php垃圾收集器,在高并发或销毁时间较长的情况下,在SESSION目录下产生大量文件,当然可以设置 分级目录进行 SESSION 文件的保存。 这会导致两个问题:第一、查找文件慢;第二,每个目录下可容纳的文件数是有限的,可能会导致新SESSION储存失败。
데이터베이스 저장소:
把Session存储在数据库里可以防止Session数据被垃圾收集器删除,可以固化存储session数据。 但是用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。
Memcache 저장소:
以这种方式来同步session,不会加大数据库的负担,并且安全性比较高,把session放到内存里面,比从文件中读取要快很多。 但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片, 如果存储块不足,还会产生内存溢出。 那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统 效率,因为网络连接同样需要资源。
redis 저장소: memcache에 비해 redis 액세스가 약간 느립니다. 혜택은 다음과 같습니다:
redis支持的数据结构较多,可以存储数组或对象,而memcache只能存储字符串。 在session机器重启的情况下,memcache所有用户都必须重新获得 session,而redis不会。3.在突然涌来大量用户产生了很多数据把 存储 session 的机器内存占满了的情况下,memcache会罢工,所有key都没过期的话就不停的覆盖最后写入的数据,而redis只是会变 慢,不会影响程序的逻辑
위 내용은 PHP에서 세션 공유를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!