2012-01-05 3 views
3

이것은 아마도 매우 간단한 질문처럼 보일 것입니다. 컴퓨터 프로세스 등에 대한 깊이있는 지식이 있다면 알 수 있습니다.서버의 PHP 페이지가 동시에 실행됩니까?

두 사람이 내 서버에서 동일한 페이지를 요청하면, 첫 번째 사람에 대해 한 번 처리 된 PHP 페이지이며 두 번째 사람에 대해 두 번째로 처리되는 페이지입니까, 아니면 동시에 서로 나란히 실행될 수 있습니까?

예를 들어보십시오. 내 PHP 구동 온라인 상점에 재고 항목이 하나 남아 있습니다. 사용자가이를 장바구니에 추가합니다. PHP 스크립트 1)는 재고가 있는지 여부를 확인합니다. 즉, 재고가 있으므로 2) 그를 위해 예약합니다.

내용 동일한 PHP 페이지가 다른 사람을 위해로드되었고, 사용자 A가 재고가 있는지 확인한 후 사용자 A가 가져 오기 전에 사용자 B도 확인한 경우 그것을 예약 할 수있는 기회가 주어지기 때문에 둘 다 끝납니다!

미안하지만 바보 같다면 대답을 찾을 수없는 것 같습니다.

+2

거래에 대해 알아야 할 것 같은데 ... –

+1

안녕하세요, Mick. 귀하의 게시물에 서명하지 마십시오. Cordially, –

+0

조언을 주신 분들께 많은 감사드립니다. 그래서 생각하면 제한 할 수있는 방법이 있습니까? 한 번에 하나의 DB 연결 만 열 수 있습니까? 데이터베이스 수준에서이 작업을 수행합니까? 스크립트가 DB 연결을 열려고하고 이미 열려있는 경우 MYSQL은 연결을 열기 전에 일시 중지합니다. – user1020317

답변

7

축하합니다. race condition입니다. :-)

PHP 페이지가 병렬로 실행되는지, 순차적으로 실행되는지는 웹 서버에 따라 다릅니다. 일반적으로 웹 서버는 들어오는 여러 요청을 동시에 처리 할 수 ​​있도록 여러 스레드를 할당합니다. 따라서 두 명 이상의 사용자가 동시에 같은 페이지를 요청하면 동일한 스크립트의 여러 인스턴스가 병렬로 실행됩니다. 타이밍과 스케줄링의 차이로 인해 각 페이지가 어떤 작업을 정확히 실행할 지 예측할 수 없습니다.

따라서 상황을 설명 할 때는 원자 적 방식으로 동작을 프로그래밍하는 것이 중요합니다. 즉, 동작이 전체적으로 완료되거나 전혀 완료되지 않았 음을 의미합니다. 귀하의 경우에는 잠금 장치, 트랜잭션, 똑똑하게 구성된 UPDATE 문, UNIQUE 색인 또는 두 명의 사용자가 같은 것을 예약 할 가능성을 피하는 여러 가지 기술을 사용할 수 있습니다.

+0

"당신은 온전하게 완성하거나 완전히 완성하지 못했습니다"에 대해 조금 더 자세히 설명해 주시겠습니까? 어떻게 그 맥락에서 도움이됩니다. 데이터베이스에서 동일한 파 미터를 요청하는 두 개의 scritpt는 위에 설명 된 것처럼 여전히 "재고 있음"시나리오를 야기 할 수 있습니다 ... 맞습니다! – Matte

-1

예 아니요. PHP는 서버 설정에 따라 동시 프로세스로 실행될 수 있지만 소규모에서는 하나의 데이터베이스 만 가질 수 있습니다. 데이터베이스 쿼리는 순차적으로 처리되므로 이러한 종류의 충돌은 결코 발생하지 않습니다. (상품을 누군가를 위해 예비하기 바로 전에 재고가 있는지 확인하는 한) More information

물론 사용자 A + B는 재고가 있음을 확인하고 A는 B보다 먼저 요청할 수 있습니다. 그러나 코드가 현재 재고가 없어서 사용자 B에게 오류가 표시 될 수 있습니다.

(여러 데이터베이스 서버에서 문제가 발생합니다. 여러 서버에 동일한 데이터가 저장되어있는 경우 데이터가 저장되기까지 시간이 걸립니다. 하지만 여기에는 상위 1000 개 사이트와 같은 이야기가 있습니다.)

+0

글쎄, 물론 * 절은 질문의 요점이며 작은 규모에서도 병렬로 실행되는 스크립트 때문에 발생합니다. 그리고 데이터베이스 질의는 반드시 순차적으로 처리되는 것은 아니며, 이는 대개 데이터베이스에 의존합니다. – deceze

+0

php는 두 스크립트를 동시에 실행할 수 있지만 하나의 데이터베이스 연결은 문제를 제한합니다. 첫 번째 질문에 yes라고 대답해야합니다.) –

+0

http://stackoverflow.com/questions/4980801/how-simultaneous-queries-are-handled-in-a-mysql-database를 참조하십시오. – deceze

2

네, 일반적으로 지나치게 자세한 설명을하지 않고 : PHP sc ripts는 각 요청에 대해 동시에 실행됩니다..

언급 한 문제가 발생하지 않도록하려면 "transactions"이라는 데이터베이스 관리 시스템의 기능을 구현해야합니다. 이렇게하면 데이터베이스 계층에서 작업을 수행하고 결국 예약이 이루어지지 않을 것입니다. 트랜잭션 내에서 수행 된 모든 작업은 롤백됩니다.

트랜잭션 외에도 언급 한 문제가 일 수 있음을 명심하여 응용 프로그램을 설계해야합니다. 따라서 데이터베이스 &을 디자인해야합니다. 1) 가능한 한 "확인"과 "예약"사이의 시간 단축, 2) 예약 할 수없는 경우 작업 중지, 마지막으로 - 비상 사태의 경우 - 3) 어떤 예약이 먼저 왔는지 그리고 어떤 예약이 취소되어야 하는지를 식별한다.

또 다른 아이디어는, "응용 프로그램의 디자인"의 범주에 떨어지는, 우리가 부를 수있는 무엇인가 "일시적으로 예약"있을 수 있습니다. 즉, 예약하려고하는 경우 잠시 (예 : 몇 초) 예약을 잠글 수 있습니다. 그 후에는 그 예약을 실제로 할 수 있는지 확인하고 영구 예약으로 바꾸거나 그냥 취소 할 수 있습니다. 일부 시스템은 고객이 자신의 장소를 예약하는 과정을 시작한 직후 더 긴 임시 예약을한다고 생각합니다.그런 다음 프로세스가 성공적이면 예약이 영구적으로 변경되지만 일정한 시간이 지나면 성공한 예약을 취소하여 다른 고객이 프로세스를 시작할 수 있습니다.

-1

예, 확실히 그들은 PHP와 병렬이지만 데이터베이스 관련 문제가있을 때 데이터베이스 관리 시스템의 트랜잭션 부분을 배워야합니다.

+0

확장하고 증명하십시오. –

+0

나는 단지 PHP에 대해서 걱정할 필요가 없다고 말했다. 하지만 데이터베이스에 관심이있을 때 적절한 트랜잭션 관리에 대해 걱정해야합니다. –

+0

예. 당신이 한 일을 알고 있습니다 - 방금 단어를 다시 정리했습니다. 그러나 이것은 단지 주장 일뿐입니다. –