PHP 스크립트에 대한 동시 요청


85

PHP 엔진이 이미 서버에서 스크립트를 실행하는 중이라면 동일한 스크립트에 대한 다른 동시 브라우저 요청은 어떻게됩니까?

  • 요청이 대기됩니까?
  • 무시 될까요?
  • 각 요청에 자체 스크립트 인스턴스가 있습니까?
  • 다른 가능성은 없나요?

답변:


140

서버는 구성에 따라 일반적으로 동시에 수백 개의 요청을 처리 할 수 있습니다. Apache를 사용하는 경우 MaxClients구성 옵션은 다음과 같습니다.

MaxClients지침이 제공됩니다 동시 요청 수에 대한 제한을 설정합니다. 제한을
초과하는 모든 연결 시도 MaxClients는 일반적으로 ListenBacklog 지시문에 따라 최대 수까지 대기열에 추가됩니다.
다른 요청이 끝날 때 자식 프로세스가 해제되면 연결이 서비스됩니다.


두 클라이언트가 동일한 페이지를 요청한다는 사실은 문제가되지 않습니다.

그래서 :

요청이 대기됩니까?

아니 ; 다음의 경우를 제외하고 :

  • 거기에 일부입니다 잠금 어딘가에 - 두 개의 요청이 동일한 클라이언트에서 오는 경우, 예를 들어, 발생할 수 있으며, 사용하는 PHP에서 파일 기반 세션 : 스크립트가 실행되는 동안, 세션이 "고정"하는 서버 / 클라이언트가 첫 번째 요청이 완료 될 때까지 (그리고 파일 잠금이 해제 될 때까지) 기다려야 파일 을 사용하여 두 번째 사용자의 세션을 열 수 있음을 의미합니다.
  • 요청은 동일한 클라이언트와 동일한 브라우저에서 나옵니다. 대부분의 브라우저는이 동작을 생성하는 서버 측이없는 경우에도 요청을 대기열에 넣습니다.
  • MaxClients현재 활성화 된 프로세스 이상이 있습니다. 바로 전에 Apache 매뉴얼의 인용문을 참조하십시오.


무시 될까요?

아니오 : 이것은 한 사용자 만 동시에 웹 사이트를 사용할 수 있음을 의미합니다. 이것은 아주 좋지 않을 것입니다.

그럴 경우 누군가가 대답했는지 확인하기 위해 동시에 F5를 치는 곳이라면 나는이 대답을 게시 할 수 없습니다!
(음, SO는 PHP가 아니지만 원칙은 동일합니다)


다른 가능성은 없나요?

네 ^^


OP 및 주석을 편집 한 후 편집하십시오.

각 요청에 자체 스크립트 인스턴스가 있습니까?

" 스크립트 인스턴스 " 와 같은 것은 없습니다 . 간단히 말해서 스크립트에 대한 요청이 이루어지는 곳에서 일어나는 일은 다음과 같습니다.

  • 웹 서버 는 요청을 처리하기 위해 다른 프로세스 를 포크 합니다 (종종 성능상의 이유로 이러한 포크는 미리 만들어 지지만 변경 사항은 없습니다)
  • 프로세스는 디스크에서 PHP 스크립트를 읽습니다.
    • 여러 프로세스가 동시에이 작업을 수행 할 수 있습니다 . 파일 읽기에 대한 잠금이 없습니다.
    • 파일이 메모리에로드됩니다. 각 프로세스에 대한 고유 한 메모리 블록
  • 메모리에있는 PHP 파일은 opcode로 " 컴파일 "됩니다.-여전히 메모리에 있습니다.
  • 해당 opcode가 실행됩니다-요청에 응답하는 프로세스에 속한 메모리 블록에서 여전히


실제로 두 명의 사용자가 동일한 PHP 스크립트 (또는 모두 동일한 PHP 파일을 포함하는 개별 PHP 스크립트)에 요청을 보내도록 할 수 있습니다 . 그것은 확실히 문제가되지 않거나, 내가 작업 한 웹 사이트 중 어느 것도 작동하지 않을 것입니다!


여러 동시 요청이 동일한 PHP 파일에 액세스하는 경우 결과는 무엇입니까? 다른 요청은 보류 상태로 유지됩니까 아니면 각 요청에 자체 스크립트 인스턴스가 있습니까?
Kevin Boyd

3
"스크립트 인스턴스"와 같은 것은 없습니다. 각 요청은 고유 한 프로세스 (또는 스레드)에 의해 처리됩니다. 스크립트는 메모리 / 디스크에서 읽혀 지지만 문제없이 동시에 여러 프로세스에서 동일한 파일을 읽을 수 있습니다 (최소한 "최신"운영 체제 (예 : Windows 및 Linux))
Pascal MARTIN

이것은 훌륭한 대답입니다. PHP 작동 방식에 대한 자세한 내용은 어디서 배울 수 있습니까? 이것에 대한 좋은 책이 있습니까?
Kevin Boyd

1
저는 그것에 대해 잘 모릅니다. 매뉴얼을 살펴보고, 인터넷에서 기사를 읽고, 여기 저기에서 질문 / 답변을 읽고, 몇 년 동안 PHP로 작업하는 것이 배우는 좋은 방법이라고 생각합니다. PHP의 작동 원리를 정확히 설명하는 책을 추천합니다. ;; "PHP 확장 및 포함"에 몇 가지 정보가 있지만 주제는 PHP 작동 방식을 설명하는 것이 아닙니다.; 어쩌면 php.net/manual/en/internals2.php을 도와 드릴까요?
Pascal MARTIN

완벽! 나를 많이 도왔다!
zookastos

21

두 클라이언트가 동시에 서버를 호출하는 경우 서버는 거의 동시에 두 클라이언트에 응답 할 수 있습니다. 여기서 클라이언트는 브라우저 수준으로 정의합니다.

즉, 동일한 컴퓨터에서 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를 사용하는 웹 사이트에서 더 이상 세션을 사용하지 않을 때 () 를 호출하는 것이 좋습니다 .


4

이 문제를 직접 만났습니다. 기본적으로 session_write_close()단일 사용자 잠금을 방지 하려면 호출해야합니다 . 호출 한 session_write_close()후에는 세션 변수를 수정하지 마십시오. 일단 호출하면 세션을 읽기 전용으로 취급하십시오.


3

매우 비표준 설정을 실행하지 않는 한 웹 서버 (Apache, IIS, nginx 등)에는 서버로 들어오는 각 요청에 대해 개별적으로 PHP를 실행하는 여러 프로세스가 있습니다. 동시 요청은 동시에 처리됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.