PHP 엔진이 이미 서버에서 스크립트를 실행하는 중이라면 동일한 스크립트에 대한 다른 동시 브라우저 요청은 어떻게됩니까?
- 요청이 대기됩니까?
- 무시 될까요?
- 각 요청에 자체 스크립트 인스턴스가 있습니까?
- 다른 가능성은 없나요?
답변
서버는 구성에 따라 일반적으로 동시에 수백 개의 요청을 처리 할 수 있습니다. Apache를 사용하는 경우 MaxClients
구성 옵션은 다음과 같습니다.
MaxClients
지침이 제공됩니다 동시 요청 수에 대한 제한을 설정합니다. 제한을
초과하는 모든 연결 시도
MaxClients
는 일반적으로 ListenBacklog 지시문에 따라 최대 수까지 대기열에 추가됩니다.
다른 요청이 끝날 때 자식 프로세스가 해제되면 연결이 서비스됩니다.
두 클라이언트가 동일한 페이지를 요청한다는 사실은 문제가되지 않습니다.
그래서 :
요청이 대기됩니까?
아니 ; 다음의 경우를 제외하고 :
- 거기에 일부입니다 잠금 어딘가에 – 두 개의 요청이 동일한 클라이언트에서 오는 경우, 예를 들어, 발생할 수 있으며, 사용하는 PHP에서 파일 기반 세션 : 스크립트가 실행되는 동안, 세션이 “고정”하는 서버 / 클라이언트가 첫 번째 요청이 완료 될 때까지 (그리고 파일 잠금이 해제 될 때까지) 기다려야 파일 을 사용하여 두 번째 사용자의 세션을 열 수 있음을 의미합니다.
- 요청은 동일한 클라이언트와 동일한 브라우저에서 나옵니다. 대부분의 브라우저는이 동작을 생성하는 서버 측이없는 경우에도 요청을 대기열에 넣습니다.
MaxClients
현재 활성화 된 프로세스 이상이 있습니다. 바로 전에 Apache 매뉴얼의 인용문을 참조하십시오.
무시 될까요?
아니오 : 이것은 한 사용자 만 동시에 웹 사이트를 사용할 수 있음을 의미합니다. 이것은 아주 좋지 않을 것입니다.
그럴 경우 누군가가 대답했는지 확인하기 위해 동시에 F5를 치는 곳이라면 나는이 대답을 게시 할 수 없습니다!
(음, SO는 PHP가 아니지만 원칙은 동일합니다)
다른 가능성은 없나요?
네 ^^
OP 및 주석을 편집 한 후 편집하십시오.
각 요청에 자체 스크립트 인스턴스가 있습니까?
” 스크립트 인스턴스 ” 와 같은 것은 없습니다 . 간단히 말해서 스크립트에 대한 요청이 이루어지는 곳에서 일어나는 일은 다음과 같습니다.
- 웹 서버 는 요청을 처리하기 위해 다른 프로세스 를 포크 합니다 (종종 성능상의 이유로 이러한 포크는 미리 만들어 지지만 변경 사항은 없습니다)
- 프로세스는 디스크에서 PHP 스크립트를 읽습니다.
- 여러 프로세스가 동시에이 작업을 수행 할 수 있습니다 . 파일 읽기에 대한 잠금이 없습니다.
- 파일이 메모리에로드됩니다. 각 프로세스에 대한 고유 한 메모리 블록
- 메모리에있는 PHP 파일은 opcode로 ” 컴파일 “됩니다.-여전히 메모리에 있습니다.
- 해당 opcode가 실행됩니다-요청에 응답하는 프로세스에 속한 메모리 블록에서 여전히
실제로 두 명의 사용자가 동일한 PHP 스크립트 (또는 모두 동일한 PHP 파일을 포함하는 개별 PHP 스크립트)에 요청을 보내도록 할 수 있습니다 . 그것은 확실히 문제가되지 않거나, 내가 작업 한 웹 사이트 중 어느 것도 작동하지 않을 것입니다!
답변
두 클라이언트가 동시에 서버를 호출하는 경우 서버는 거의 동시에 두 클라이언트에 응답 할 수 있습니다. 여기서 클라이언트는 브라우저 수준으로 정의합니다.
즉, 동일한 컴퓨터에서 2 개의 브라우저를 사용하여 동일한 웹 사이트 / 페이지를 동시에로드하는 경우 둘 다 동시에로드해야합니다.
그러나 우리는 PHP에 대해 이야기하고 있기 때문에 세션에 대해 특별한 메모를해야합니다. 페이지가 세션을 사용하는 경우 서버는 한 번에 한 페이지 만 제공합니다. 이는 스크립트가 종료 될 때까지 세션 파일이 잠기기 때문입니다.
이 예를보세요. 2 개의 파일은 동일한 세션 (일명 동일한 브라우저 동일한 사용자)에서로드됩니다.
scripta.php requested scripta.php served
------+---+---------------------------------+------------------------>
scripta.php started
scriptb.php requested scriptb.php started
---------------+-------------------------------+-----------------+--->
scriptb.php served.
scriptb.php는 scripta.php가 제공된 후에 만 시작됩니다. 이는 scripta.php가 시작될 때 scripta.php가 세션 파일에 쓸 수 있도록 세션 파일이 다른 스크립트에 잠겨 있기 때문입니다. scripta.php가 완료되면 세션 파일의 잠금이 해제되어 다른 스크립트에서이를 사용할 수 있습니다. 따라서 scriptb.php는 세션 파일이 해제 될 때까지 기다린 다음 세션 파일을 잠그고 사용합니다.
이 프로세스는 여러 스크립트가 동일한 세션 파일에 기록하는 것을 방지하기 위해 계속 반복됩니다. 따라서 session_write_close
특히 많은 iframe 또는 AJAX를 사용하는 웹 사이트에서 더 이상 세션을 사용하지 않을 때 () 를 호출하는 것이 좋습니다 .
답변
이 문제를 직접 만났습니다. 기본적으로 session_write_close()
단일 사용자 잠금을 방지 하려면 호출해야합니다 . 호출 한 session_write_close()
후에는 세션 변수를 수정하지 마십시오. 일단 호출하면 세션을 읽기 전용으로 취급하십시오.
답변
매우 비표준 설정을 실행하지 않는 한 웹 서버 (Apache, IIS, nginx 등)에는 서버로 들어오는 각 요청에 대해 개별적으로 PHP를 실행하는 여러 프로세스가 있습니다. 동시 요청은 동시에 처리됩니다.