2010-04-05 3 views
2

이 주제에 대해 몇 가지 조사를했지만 가치있는 것을 발견하지 못했습니다.PHP에서 중요한 섹션을 보호하는 방법?

PHP 기본 세션 처리기를 사용하지 않으면 요청 수준에서 세션 잠금이 없습니다. 그래서, 나는 비판적 섹션을 스스로 보호해야한다.

자바에서는 이 동기화되었습니다.입니다. C#에서는 잠금입니다.

PHP에서 어떻게 그럴 수 있습니까?

+0

어떤 상황에 관심이 있습니까? 나는 당신이 쟁점으로 생각하는 것이 PHP의 문제인지 확신 할 수 없다. – cletus

+0

병렬 out-of-order 요청에 여러 가지 상태 변경 사항이있는 경우 문제가됩니다. 요청이 서로의 상태를 겹쳐 쓰지 못하게하려면 세션의 상태 변경 사항을 직렬화해야합니다. – pestilence669

답변

3

PHP 스크립트는 멀티 스레드가 아니기 때문에 중요 섹션이 적절하다고 생각하지 않습니다. 여러 인스턴스가 병렬로 실행되기 때문에 경쟁 조건이 있다는 데 동의하지만 중요한 섹션은 문제를 해결하지 못합니다.

파일 기반 세션 처리기를 사용하는 경우 기본 flock()을 사용해보십시오. 데이터베이스를 사용하는 경우 엔진 고유의 (가능하면 행 수준) 잠금 메커니즘을 사용해보십시오. memcached를 사용하는 경우 분산 잠금 시스템을 구현할 수 있습니다.

잠금 장치를 너무 넓게 적용하고 싶지는 않습니다. 가능한 한 세부적인 내용을 원할 것입니다 (아마도 세션 ID에 묶여있을 것입니다). 모든 세션 동작을 직렬화하려고하면 막대한 병목 현상이 발생합니다.

데이터베이스 세계 (및 다른 곳)에서는 낙관적 인 "잠금 장치"만 있으면됩니다. 그들은 증분되는 간단한 카운터를 포함합니다. 카운트가 "꺼짐"(충돌)이면 레코드가 업데이트되지 않으므로 다시 차이를 적용하여 차이를 적절하게 적용 할 수 있습니다. 재 시도와 결합 된 UPDATE table WHERE count = lastcount 유형의 것입니다. 이것은 종종 트릭을합니다.

물론이 목표를 달성하기 위해 파일 잠금, SYSV 세마포 (아껴서) 및 다양한 다른 방법을 사용할 수 있습니다. 단, 이것은 경쟁 조건처럼 들리지만 스레드와는 아무런 관련이 없음을 기억하십시오.

+0

답변 해 주셔서 감사합니다. PHP에는 Java 및 C#과 같은 스레딩 모델이 없습니다.그러나 같은 경우 PHP, 프로세스 또는 스레드에서 하나의 요청 처리만으로 하나의 세션 객체에 액세스해야합니다. 따라서 모든 세션 비헤이비어를 직렬화하지 않는 것이 좋습니다. 잠금 기능을 작게 설정하면 성능이 향상되지만 코드가 복잡 해지는 것은 아닙니다. 단순히 기본 세션 핸들러와 같이 요청 레벨에서 세션을 잠그는 것은 어리 석으나 간단합니다. –

+0

그것은 간단합니다. 그러나 그것은 게으르다. 왜 세션마다 ID를 잠글까요? 단일 서버 또는 분할 클라우드에서는 각 세션에 대해'/ tmp/XXX' 파일을 쉽게 잠글 수 있습니다. 그것은 실제적으로 당신의 문제를 해결할 것입니다. – pestilence669

0

대부분의 경우 PHP는 스레드 모델 (메모리 공유 없음)이 없기 때문에 중요한 섹션을 다룰 필요가 없습니다. 나는 semephores을 사용할 수 있다고 생각지 않는다. PHP는 PHP 작성자 Rasmus Lerdorf의 슬라이드에서 볼 수 있듯이 "Share-nothing Architecture"을 사용합니다. 당신이

공유 데이터 당신도하지 않는 단순한 PHP 스크립트는 아파치의 상단에 실행으로 데이터 저장 층

아래로 밀어 슬라이드에서 볼 수 있듯이 이는 중요한 부분을 다루어야합니다. 데이터베이스를 통해 데이터와 상호 작용해야합니다. 파일을 사용하고 잠글 수도 있지만 파일 대신 데이터베이스를 사용합니다.

희망 사항이 질문에 조금 대답합니다.

+0

PHP가 비공유 아키텍처 인 경우에도 세션 변수는 여러 요청에 의해 공유됩니다. 여전히 중요한 부분이있을 수 있습니다. –

+0

세션이 여러 요청간에 공유되는 것 같지만 안전한 표준입니까? 경주 조건을 어떻게 얻을 수 있습니까? – Alfred