>  기사  >  백엔드 개발  >  PHP 세션으로 인해 동시성 문제가 발생할 수 있음

PHP 세션으로 인해 동시성 문제가 발생할 수 있음

伊谢尔伦
伊谢尔伦원래의
2016-11-25 14:02:111234검색

웹 애플리케이션을 개발할 때 사람들은 종종 Session을 사용하여 데이터를 저장합니다. 그러나 일부 사람들은 PHP에서 세션을 부적절하게 사용하면 동시성 문제가 발생할 수 있다는 사실을 모를 수도 있습니다. 인도 의료 산업의 소프트웨어 솔루션 제공업체인 Plus91 Technologies의 수석 엔지니어인 Kishan Gor는 자신의 개인 블로그에서 이 문제를 설명했습니다.

동일한 클라이언트가 여러 요청을 동시에 보내고 각 요청이 세션을 사용하는 경우 PHP 세션 잠금이 있으면 서버가 이러한 요청에 병렬이 아닌 직렬로 응답하게 됩니다. 이는 기본적으로 PHP가 파일을 사용하여 세션 데이터를 저장하기 때문입니다. 각각의 새로운 세션에 대해 PHP는 파일을 생성하고 계속해서 해당 파일에 데이터를 씁니다. 따라서 session_start() 메소드가 호출될 때마다 Session 파일이 열리고 파일에 대한 단독 잠금이 획득됩니다. 이런 방식으로 서버 스크립트가 요청을 처리하고 있고 클라이언트가 세션을 사용해야 하는 요청을 보내는 경우 이전 요청이 처리되고 파일에 대한 배타적 잠금이 해제될 때까지 후자의 요청이 차단됩니다. 그러나 이는 동일한 클라이언트의 여러 요청으로만 제한됩니다. 즉, 한 클라이언트의 요청이 다른 클라이언트의 요청을 차단하지 않습니다.

스크립트가 짧으면 일반적으로 문제가 되지 않습니다. 그러나 스크립트를 실행하는 데 오랜 시간이 걸리면 문제가 발생할 수 있습니다. 최신 웹 애플리케이션 개발에서 매우 일반적인 상황은 AJAX 기술을 사용하여 동일한 페이지 내에서 데이터를 얻기 위해 여러 요청을 보내는 것입니다. 이러한 요청이 모두 세션을 사용해야 하는 경우 첫 번째 요청이 서버에 도달한 후 세션 잠금이 획득되고 다른 요청은 서로 종속성이 없더라도 순차적으로 처리됩니다. 이렇게 하면 페이지의 응답 시간이 크게 늘어납니다.

이러한 문제를 피하는 방법이 있는데, 바로 session_write_close() 메소드를 호출하여 Session 사용 후 즉시 종료하는 것입니다. 이러한 방식으로 현재 스크립트가 여전히 처리를 기다리고 있는 경우에도 세션 잠금이 해제됩니다. 이 메소드를 호출한 후에는 현재 스크립트가 세션을 더 이상 작동할 수 없다는 점에 유의해야 합니다.

이 글에 언급된 문제와 의견은 session_start() 메소드를 사용하는 PHP 기본 세션 관리 모드에만 적용된다는 점에 유의해야 합니다. 예를 들어 일부 사용자는 애플리케이션이 AWS EC2에서 호스팅되고 DynamoDB가 올바르게 구성되면 세션 잠금 문제가 발생하지 않는다고 지적했습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.