2013-09-23 2 views
0

PHP로 사이트를 개발하고 있습니다. 사용자 세션이 시작되면 $ _SESSION var에 db 행을 모두로드합니다. 사용자가 db 값을 변경하면 $ _SESSION var도 업데이트됩니다.모든 세션에서 사용자 데이터의 일관성이 유지됩니다.

동일한 사용자에 대해 둘 이상의 세션이 활성화되어 있으면 문제가 발생합니다. 데이터베이스에 과부하가 걸리지 않고 같은 사용자의 모든 세션에 대한 데이터를 업데이트 할 수 있습니까? 아니면, PHP가 동일한 사용자에게 속한 모든 세션에 대해 동일한 세션 파일을 사용하도록하는 방법이 있습니까? 또는 세션이 계속 될 때마다 db를 쿼리해야합니다.

또 다른 딜레마가 있습니다. 가치가 있습니까? 내 말은,이 메커니즘이 서버 부하를 줄일 수있는 방법을 모르고,이 메커니즘이 파일 기반 세션에 적용되는지 또는 다른 세션 저장 유형을 사용해야하는지 여부를 알지 못합니다.

이 질문은 다소 번만하여 this other question on mine과 관련이 있습니다 (이 문제를 해결하려면 간단히 모든 세션 파일을 삭제하는 것이지만).

+1

데이터가 DB에있는 경우 매번 세션을 통해 데이터를 전송할 필요가 없습니다. 세션에 저장된 로그인 한 사용자 만 필요합니다. 예를 들어 사용자가 로그인되어 있고 자신의 user_id와 관련된 아바타 또는 기타 항목을 업데이트한다고 가정 해 봅시다. 왜 당신이 $ _SESSION에 $ row [ 'avatar']를 저장해야할까요? 언제든지 액세스 할 수 있습니다. ''SELECT avatar FROM users where user_id = $ _SESSION [ 'user_id'] "' –

+0

@RoyalBg 어쨌든 데이터를 유지한다면 데이타베이스를 호출하면 – djot

+0

정확히 @RoyalBg를 읽습니다. 'user_id'를 사용하여 db에서 evrything을 업데이트 한 다음 전자 메일이나 사용자 이름을 업데이트해야하고 db로 업데이트 한 다음 다시 업데이트해야합니다 업데이트 된 이메일 또는 사용자 이름을 세션에 저장하십시오. –

답변

1

정말 $ _SESSION에 많은 데이터가 필요하겠습니까? 그리고 실제로 표시해야하는 데이터를 결정하는 데 시간이 필요합니다.

대부분의 경우 사용자가 로그인 한 세션 식별자 (user_id 포함) 만 있으면 데이터베이스에서 필요한 데이터를 직접 가져올 수 있습니다.

사용자가 아바타를 변경할 수 있고이 아바타를 표시 할 장소가 너무 많지 않다면 세션에 저장할 필요가없고 동시에 SELECT 수 있습니다. 예를 들어, SELECTS$_SESSION['user_id']에 의해 아바타가 다른 사용자에게 개인 메시지를 보내려고 할 때 트리거 페이지를 가질 수 있습니다. 그렇지 않으면 캐시를 넣을 수 있습니다 (예 : memcached 사용). 사용자 아바타를 선택하는 쿼리가 한 시간에 한 번 이상 수행되지 않아야합니다.

사용자가 이메일을 변경하면 변경되지 않습니다. 다른 사람이 메시지를 보내려고하면 SELECT 쿼리가 실행됩니다. 그렇지 않으면 캐시가 설정됩니다.

사용자가 자신의 아바타, 이메일 및 기타 간단한 정보를 변경 한 다음 색인 페이지에 액세스했다고 가정 해 보겠습니다. 세션에서 식별자 만로드합니다. db에는 레코드가 있지만 아직 선택되지 않았습니다. SELECT 쿼리가 전송되지 않았기 때문에 세션이 가볍거나 데이터베이스로드가 없으므로 서버로드가 없습니다.

사용자가 세션 (이 경우 두 번째 로그)을 설정하려고 시도한 횟수에 관계없이 db에 현재 데이터가 있고 식별자가있는 세션 만 있습니다. 그의 모든 인스턴스를 식별 할 수 있지만 필요하지 않은 데이터는 사용하지 마십시오.

+0

감사합니다. memcached가 완벽 할 것입니다. :) 열을 선택하면 전체 사용자 행을 한 번로드하는 것이 좋지 않습니까? –

0

1 글쎄, 내 세션 처리기로이 작업을 수행 할 수 있습니다. 나는 username과 userid 같은 몇 가지 추가 정보/열과 함께 databased 세션을 사용합니다. 그렇게하면 직렬화 된 데이터를 사용하지 않고 어느 세션이 어떤 사용자에게 속하는지 정확하게 판단 할 수 있습니다.

http://php.net/manual/de/function.session-set-save-handler.php

2

그러나 귀하의 경우는 사용자 테이블을 업데이트 한 다음 $ _SESSION [ '사용자']에 (신규) 데이터를 넣어 다시 사용자를 선택하는 것이 더 간단 할 수 있습니다. (모든 세션에 대해 새 데이터를 다시로드하려면 일부 "사용자 데이터가 업데이트되었습니다"정보가 필요합니다.)

3 또는 사용자가 두 번 이상 로그인 할 수 없도록하십시오.

+0

매번 데이터를 다시 쿼리하는 것이 훨씬 간단합니다. 그러나 이것은 문제가되지 않습니다. 내 진짜 문제는 이와 같은 메커니즘이 정말 효율적이라면 ... 내 질문을 업데이트하고 "다른 딜레마"를 참조하십시오. –

+0

정말 그런 기능이 필요합니까? 나는 당신의 "개념"이 잘못되었다는 느낌을 가지고 있습니다. – djot

관련 문제