PHP: $_SESS 내에 '개체' 저장이온
$_SESSION에 오브젝트를 저장할 수 있다는 것을 알게 되었습니다.다른 페이지로 이동해도 오브젝트가 남아 있기 때문에 매우 멋집니다.이 방법을 사용하기 전에 이것이 정말 좋은 아이디어인지 아니면 잠재적인 함정이 있는지 알아보겠습니다.
단일 진입점이 있다면 그렇게 할 필요가 없다는 것을 알고 있지만, 저는 아직 도착하지 않았기 때문에 단일 진입점이 없습니다.또한 이와 같이 상태를 잃지 않기 때문에 오브젝트를 유지하고 싶습니다.(또한 스테이트리스 사이트를 프로그래밍해야 한다는 것도 읽었지만 아직 그 개념은 잘 모르겠습니다.)
즉, 세션에 오브젝트를 저장해도 괜찮습니까, 문제가 있습니까?
편집:
임시 요약: 이제 데이터베이스에 다시 문의하는 경우에도 개체를 다시 생성하는 것이 더 나을 수 있습니다.
더 많은 답변이 그 측면에 대해 좀 더 자세히 설명해 줄 수 있습니다!
이 토픽이 오래된 것은 알지만, 이 문제가 계속 제기되어 만족스러운 대처가 되지 않았습니다.
$_SESSION에 객체를 저장하든, 숨김 양식 필드에 저장된 데이터를 기반으로 패브릭 전체를 재구성하든, 매번 DB에서 다시 쿼리하든, 상태를 사용합니다.HTTP는 상태 비저장입니다(거의 GET vs. PUT 참조). 그러나 웹 앱에서 수행하는 거의 모든 작업은 상태를 유지해야 합니다.국가를 궁지에 몰아넣는 것은 이론적인 승리를 의미하는 것처럼 행동하는 것은 잘못된 것이다.State is state is state.state를 사용하면 스테이트리스로 얻을 수 있는 다양한 기술적 이점을 잃게 됩니다.당신이 그것에 대해 잠을 설쳐야 한다는 것을 미리 알지 않는 한 이것은 잠을 설칠 일이 아니다.
저는 특히 행크 게이가 제기한 "이중적" 주장으로 받은 축복에 당황했습니다.OP는 분산형 부하 분산형 전자상거래 시스템을 구축하고 있습니까?제 추측으로는 그렇지 않습니다.또한 $User 클래스나 그 어떤 것을 시리얼화해도 서버를 복구할 수 없을 정도로 망가뜨리는 일은 없다고 생각합니다.조언: 용도에 맞는 기술을 사용하세요.$_SESSION 내의 오브젝트는 정상이며, 상식적인 주의사항을 따릅니다.만약 당신의 앱이 갑자기 아마존에 필적하는 트래픽으로 바뀐다면, 당신은 다시 적응할 필요가 있을 것입니다.그런 게 인생이다.
session_start() 호출이 이루어졌을 때 클래스 선언/정의가 이미 PHP에 의해 발견되었거나 이미 설치된 자동 로더에 의해 발견될 수 있으면 괜찮습니다.그렇지 않으면 세션스토어에서 오브젝트를 역직렬화할 수 없습니다.
HTTP가 상태 비저장 프로토콜인 데는 이유가 있습니다.세션 용접 상태를 HTTP로 전송합니다.경험적으로 세션 상태는 사용하지 않는 것이 좋습니다.
업데이트: HTTP 수준에서는 세션의 개념이 없습니다.서버는 클라이언트에 고유 ID를 부여하고 모든 요구에 대해 다시 전송하도록 지시함으로써 이를 제공합니다.그런 다음 서버는 이 ID를 키로서 Session 객체의 큰 해시 테이블로 사용합니다.서버는 요청을 수신할 때마다 클라이언트가 요청과 함께 제출한ID에 따라 세션개체의 해시테이블에서 세션 정보를 검색합니다.이 모든 추가 작업은 확장성에 대한 이중고를 초래합니다(HTTP가 스테이트리스인 큰 이유).
- Wammy One:따라서 단일 서버에서 수행할 수 있는 작업이 줄어듭니다.
- 와미 투:기존 서버에 요청을 라우팅할 수 없기 때문에 스케일아웃이 더 어려워집니다.모든 서버에 동일한 세션이 있는 것은 아닙니다.특정 세션 ID를 가진 모든 요청을 동일한 서버에 고정할 수 있습니다.이는 쉽지 않고 단일 장애 지점입니다(시스템 전체가 아니라 사용자의 큰 부분).또는 클러스터 내의 모든 서버에서 세션 스토리지를 공유할 수 있지만 네트워크 연결 메모리, 스탠드 아론 세션 서버 등 복잡성이 높아졌습니다.
이 모든 것을 고려하면 세션에 더 많은 정보를 입력할수록 퍼포먼스에 대한 영향은 커집니다(Vinko가 지적한 바와 같이).또한 Vinko가 지적한 바와 같이 오브젝트가 시리얼화되지 않으면 세션이 잘못됩니다.따라서 경험으로 볼 때 세션에 꼭 필요한 것 이상을 넣는 것은 피해야 합니다.
@Vinko 일반적으로 추적하고 있는 데이터를 회신한 응답에 삽입하여 클라이언트에 다시 전송함으로써 서버 스토어 상태를 회피할 수 있습니다(숨겨진 입력으로 데이터를 보내는 등).서버 측 상태 추적이 필요한 경우 백업 데이터스토어에 있어야 합니다.
(Vinko는 PHP는 세션 정보를 저장하기 위해 데이터베이스를 사용할 수 있으며, 매번 클라이언트에 데이터를 재전송하도록 하면 잠재적인 확장성 문제가 해결될 수 있지만 클라이언트가 모든 상태를 제어할 수 있게 되었기 때문에 주의해야 할 보안 문제가 크게 발생합니다.)
- 시리얼화할 수 없는 오브젝트(또는 시리얼화할 수 없는 멤버 포함)는 예상대로 $_SESSION에서 나오지 않습니다.
- 세션이 클수록 서버에 부담이 된다(상태의 메거진을 시리얼화 및 역시리얼화하는 것은 매번 비용이 많이 든다).
그것 말고는 아무 문제 없어요.
제 경험상 성질이 있는 Std Class보다 더 복잡한 것은 일반적으로 가치가 없습니다.직렬화 해제 비용은 항상 세션에 저장된 식별자가 지정된 데이터베이스에서 다시 생성하는 것 이상입니다.멋있어 보이지만 (항상 그렇듯이) 프로파일링이 핵심입니다.
꼭 필요하지 않으면 주(州)를 사용하지 말 것을 제안합니다.세션을 사용하지 않고 개체를 재구축할 수 있는 경우 이 작업을 수행합니다.웹 응용 프로그램에 상태가 있으면 응용 프로그램 구축이 더 복잡해집니다. 사용자가 어떤 상태인지 확인해야 하는 모든 요청에 대해 말입니다.물론 세션 사용을 피할 수 없는 경우가 있습니다(예: 사용자는 웹 응용 프로그램에서 세션 중에 로그인 상태를 유지해야 합니다).마지막으로 session 오브젝트는 큰 오브젝트의 시리얼화와 시리얼화를 해제하는 퍼포먼스에 영향을 미치기 때문에 가능한 한 작게 유지하는 것이 좋습니다.
페이지 로드 사이에 리소스 유형(예: DB 연결 또는 파일 포인터)이 유지되므로 보이지 않게 다시 작성해야 합니다.
또한 세션의 크기를 고려하십시오. 세션 저장 방법에 따라 크기가 제한되거나 지연 시간이 발생할 수 있습니다.
소프트웨어 라이브러리를 업그레이드할 때도 언급했습니다.소프트웨어를 업그레이드하고 이전 버전에는 V1 소프트웨어의 클래스 이름과 세션 중인 개체가 있었습니다.세션 중인 개체를 빌드하려고 할 때 새 소프트웨어가 충돌했습니다.V2 소프트웨어에서 더 이상 동일한 클래스를 사용하지 않아 찾을 수 없었습니다.세션 오브젝트를 검출하고, 세션이 발견되면 삭제하고, 페이지를 새로고침하기 위해 몇 가지 수정 코드를 입력해야 했습니다.처음에 이 버그가 보고되었을 때 가장 큰 고민은 이 버그를 재현하고 있었다는 것입니다(모두 너무 익숙해서 "그것은 나에게 효과가 있습니다").이 버그는 최근 오래된 시스템과 새로운 시스템을 드나든 사람들에게만 영향을 미쳤습니다.다만, 론칭 전에 이 버그를 발견한 것은, 모든 유저가 세션에 낡은 세션 변수를 가지고 있었기 때문입니다.모든 사람에게 크래쉬가 일어날 가능성이 있어, 최악의 론칭이 될 가능성이 있습니다.
어쨌든 수정안에서 제안하신 대로 오브젝트를 다시 만드는 것이 좋다고 생각합니다.따라서 id를 저장하고 각 요구에 대해 데이터베이스에서 개체를 꺼내는 것이 더 낫거나 더 안전할 수 있습니다.
언급URL : https://stackoverflow.com/questions/132194/php-storing-objects-inside-the-session
'programing' 카테고리의 다른 글
특정 필드에 대한 Jackson JSON 사용자 지정 일련화 (0) | 2023.01.13 |
---|---|
nuxtServerInit은 네비게이션이 발생할 때마다 실행됩니다. (0) | 2023.01.03 |
phpMyAdmin의 MySQL 로그는 어디서 찾을 수 있습니까? (0) | 2023.01.03 |
후행 줄바꿈을 삭제하려면 어떻게 해야 합니까? (0) | 2023.01.03 |
JavaScript에서 배열의 최소/최대 요소를 찾습니다. (0) | 2023.01.03 |