programing

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

firstcheck 2022. 11. 7. 21:36
반응형

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

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

  • 요청은 큐잉됩니까?
  • 무시당할까?
  • 각 요청에는 자체 스크립트 인스턴스가 있습니까?
  • 다른 가능성은요?

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

MaxClients 수에 합니다.
를 통한 접속 MaxClients「ListenBacklog」는, 「ListenBacklog」라고 합니다.
다른 요청 끝에 자 프로세스가 해방되면 연결이 처리됩니다.


두 클라이언트가 같은 페이지를 요청하는 것은 문제가 되지 않습니다.

따라서:

요청은 큐잉됩니까?

아니요. 단, 다음과 같은 경우는 제외합니다.

  • 어떤 곳에 잠금이 있습니다.예를 들어, 2개의 요구가 같은 클라이언트에서 온 경우, PHP에서 파일 기반 세션을 사용하는 경우: 스크립트가 실행되는 동안 세션은 "잠금"됩니다.즉, 서버/클라이언트는 첫 번째 요구가 완료될 때까지(및 파일의 잠금이 해제될 때까지) 기다려야 합니다.e - 두 번째 사용자의 세션을 엽니다.
  • 이 경우 대부분의 브라우저는 이 동작을 발생시키는 서버 측이 없는 경우에도 요청을 큐잉합니다.
  • MaxClients현재 활성 프로세스 - 직전 Apache 매뉴얼의 인용문을 참조하십시오.


무시당할까?

아니요: 이것은 한 명의 사용자만 동시에 웹사이트를 사용할 수 있다는 것을 의미합니다.이것은 그다지 좋지 않습니다.

한다면 이 수 .
, 은 동일합니다 (), SO ) PHP )))))))))))))))))))))))))))))))


다른 가능성은요?

있음 ^^


OP 및 코멘트를 편집한 후 다음과 같이 편집합니다.

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

스크립트 인스턴스(instance)는 없습니다.간단히 스크립트에 대한 요구가 이루어진 경우 다음과 같은 일이 발생합니다.

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


실제로, 2명의 유저가 같은 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.

그 스크립트 b에 주목해 주세요.php는 스크립트 뒤에만 시작됩니다.php가 제공되었습니다.왜냐하면 스크립타가 있을 때.php가 시작되어 세션파일이 다른 스크립트로 잠겨 있기 때문에 스크립트가 실행됩니다.php는 세션 파일에 쓸 수 있습니다.스크립타 할 때.php가 완료되고 세션파일이 잠금 해제되므로 다른 스크립트에서 사용할 수 있습니다.스크립트 b 입니다.php는 세션파일이 해방될 때까지 기다렸다가 세션파일을 잠그고 사용합니다.

이 프로세스는 여러 스크립트가 같은 세션파일에 쓰는 것이 지연되는 것을 방지하기 위해 계속 반복됩니다.따라서 세션을 더 이상 사용하지 않을 때는 ()를 호출하는 것이 좋습니다.특히 다수의 iframe 또는 AJAX를 사용하는 웹사이트에서는 더욱 그렇습니다.

나도 이걸 우연히 만났어기본적으로는 전화하셔야 합니다.session_write_close()단일 사용자 잠금을 방지합니다.전화를 걸면 확인하세요.session_write_close()세션 변수를 수정하려고 하지 않습니다.호출하면 이후 세션은 읽기 전용으로 취급합니다.

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

언급URL : https://stackoverflow.com/questions/1430883/simultaneous-requests-to-php-script

반응형