문제

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

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

해결책

구성에 따라 서버는 일반적으로 서비스를 제공 할 수 있습니다. 동시에 수백 개의 요청 - 아파치를 사용하는 경우 MaxClients 구성 옵션은 다음과 같습니다.

그만큼 MaxClients 지침은 제공 될 동시 요청 수에 대한 제한을 설정합니다.
모든 연결 시도 MaxClients 한도는 일반적으로 ListenBackLog 지시문을 기반으로 숫자까지 대기됩니다.
다른 요청이 끝날 때 아동 프로세스가 해제되면 연결이 서비스됩니다.


두 고객이 같은 페이지를 요청한다는 사실은 문제가되지 않습니다.

그래서 :

요청이 대기 될까요?

아니 ; IF를 제외하고 :

  • 일부가 있습니다 자물쇠 어딘가에 - 예를 들어 두 요청이 같은 클라이언트에서 나오고 사용중인 경우 발생할 수 있습니다. PHP의 파일 기반 세션 : 스크립트가 실행되는 동안 세션은 "잠금"되어 서버/클라이언트가 첫 번째 요청이 완료 될 때까지 기다려야 함을 의미합니다. (파일이 잠금 해제되었습니다) 파일을 사용하여 두 번째 사용자의 세션을 열 수 있습니다.
  • 요청은 동일한 클라이언트와 동일한 브라우저에서 나옵니다. 대부분의 브라우저는이 동작을 생성하는 서버 측면이 없더라도이 경우에 요청을 대기합니다.
  • 더 많이있다 MaxClients 현재 활성 프로세스 - 바로 전에 Apache 's Manual의 견적을 참조하십시오.


그들은 무시 될까요?

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

그것이 사실이라면, 나는 당신이 동시에 F5를 때리는 곳이 누군가가 대답했는지 확인하기 위해이 답을 게시 할 수 없었습니다!
(음, PHP에도 있지 않지만 원칙은 동일합니다)


다른 가능성이 있습니까?

예 ^^


OP와 주석을 편집 한 후 편집 :

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

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

  • 웹 서버 포크 다른 과정 요청을 처리합니다 (종종 공연의 이유로, 그 포크는 미리 만들어 지지만 이것은 아무것도 바뀌지 않습니다)
  • 프로세스는 디스크에서 PHP 스크립트를 읽습니다
    • 여러 프로세스가 동시에이를 수행 할 수 있습니다 : 파일 읽기에는 잠금이 없습니다
    • 파일은 메모리에로드됩니다. 각 프로세스에 대한 뚜렷한 메모리 블록에서
  • 메모리의 PHP 파일은 "편집"Opcodes에 - 여전히 메모리에 있습니다
  • 해당 opcode는 실행됩니다. 여전히 귀하의 요청에 응답하는 프로세스에 속하는 메모리 블록에서 나옵니다.


실제로 두 명의 사용자가 동일한 PHP 스크립트에 요청을 보낼 수 있습니다. (또는 모두 동일한 PHP 파일을 포함하는 별개의 PHP 스크립트) ; 그것은 확실히 문제가 아니거나, 내가 일한 웹 사이트 중 어느 것도 효과가 없었습니다!

다른 팁

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

즉, 동일한 컴퓨터에서 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를 별도로 실행하는 여러 프로세스가 있습니다. 동시 요청은 동시에 서비스됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top