지속적인 데이터베이스 접속

지속적인 접속은 스크립트 실행이 끝날 때 닫히지 않는 링크입니다. 지속적인 접속이 요청되면, PHP는 동일한 영구 연결(이전부터 열린 상태로 유지됨)이 이미 있는지 확인하고 존재하는 경우 이를 사용합니다. 존재하지 않으면 링크를 생성합니다. '동일한' 연결은 동일한 사용자 이름과 동일한 암호(해당되는 경우)를 사용하여 동일한 호스트에 대해 열린 연결입니다.

웹 서버가 작동하고 부하를 분산하는 방식에 완전히 익숙하지 않은 사람들은 영구 연결을 그렇지 않은 것으로 착각할 수 있습니다. 특히, 동일한 링크에서 '사용자 세션'을 여는 기능을 제공하지 않으며 트랜잭션을 효율적으로 구축할 수 있는 기능을 제공하지 않으며 다른 많은 작업을 수행하지 않습니다. 사실, 이런 말들에 대해 명백히 말하자면, 지속적인 접속은 비지속적인 접속에 비해 어떠한 기능적인 향상도 주지 못합니다.

왜?

이것은 웹 서버가 작동하는 방식과 관련이 있습니다. 웹 서버가 PHP를 사용하여 웹 페이지를 생성할 수 있는 세 가지 방법이 있습니다.

첫 번째 방법은 PHP를 CGI "래퍼"로 사용하는 것입니다. 이 방법으로 실행하면 웹 서버에 대한 모든 페이지 요청(PHP 페이지의 경우)에 대해 PHP 인터프리터 인스턴스가 생성되고 소멸됩니다. 모든 요청 후에 소멸되기 때문에 획득한 모든 리소스(예: SQL 데이터베이스 서버에 대한 링크)는 소멸될 때 닫힙니다. 이 경우 영구 연결을 사용하여 얻을 수 있는 것은 없으며 단순히 지속되지 않습니다.

두 번째 방법은 가장 대중적인 방법인데, PHP를 다중프로세스 웹서버의 모듈로 사용하는 것입니다. 다중프로세스 서버는 보통 한 개의 부모 프로세스와, 이와 유기적으로 연결되어 웹 페이지를 실제로 만드는 작업을 하는 여러개의 자식 프로세스들을 가지고 있습니다. 클라이언트에서 요청이 왔을 때, 다른 클라이언트를 처리하고 있지 않은 자식 프로레스로 넘겨집니다. 이는 동일한 클라이언트가 서버에 두번째 요청을 하였을 때, 처음과 다른 자식 프로세스에서 처리할 수 있다는 의미입니다. 지속적인 접속을 열면, SQL 서비스를 요구하는 모든 페이지에서 동일한 SQL 서버 접속을 재사용할 수 있습니다.

마지막 방법은 PHP를 다중 스레드 웹 서버용 플러그인으로 사용하는 것입니다. 현재 PHP는 Netscape FastTrack(iPlanet), Microsoft의 Internet Information Server(IIS) 및 O'Reilly의 WebSite Pro와 같은 다중 스레드 서버에서 PHP를 플러그인으로 사용할 수 있도록 하는 WSAPI 및 NSAPI(Windows)를 지원합니다. . 동작은 본질적으로 앞에서 설명한 다중 프로세스 모델과 동일합니다.

지속적인 접속이 실제로 어떠한 기능적인 향상도 주지 못한다면, 이것을 사용해 어떤 이점이 있나요?

여기서 답은 매우 간단합니다. 효율성입니다. SQL 서버에 대한 링크를 생성하기 위한 오버헤드가 높으면 영구 연결이 좋습니다. 이 오버헤드가 실제로 높은지 여부는 많은 요인에 따라 다릅니다. 데이터베이스가 어떤 종류인지, 웹 서버가 있는 컴퓨터와 같은 컴퓨터에 있는지 여부, SQL 서버가 있는 컴퓨터에 로드된 정도 등입니다. 결론은 연결 오버헤드가 높으면 지속적인 연결이 상당한 도움이 된다는 것입니다. 그들은 자식 프로세스가 SQL 서버에 연결해야 하는 페이지를 처리할 때마다가 아니라 전체 수명 동안 한 번만 연결하도록 합니다. 이것은 영구 연결을 연 모든 자식에 대해 서버에 대한 자체 개방형 영구 연결을 가짐을 의미합니다. 예를 들어, SQL 서버에 지속적으로 연결하는 스크립트를 실행하는 20개의 서로 다른 하위 프로세스가 있는 경우 각 하위에서 하나씩 SQL 서버에 대한 20개의 서로 다른 연결이 있습니다.

이 방법은 지속적인 접속의 개수가 데이타베이스 서버가 허용하는 접속수를 초과해서 설정되어 있는 경우 문제가 될 수 있습니다. 만약 데이타베이스가 16개의 동시 접속을 허용하고, 이 서버 세션들이 모두 사용중이면, 17번째 thread는 연결을 시도하다가 실패할 것입니다. 만약 여러분이 만든 스크립트에 이런 경우에 대비한 특별한 대책이 없이 재시도를 반복하다보면 가능한 모든 connection을 사용하여 복구할 수 없게 됩니다. 이런 abandoned 혹은 idle connection을 다루는 자세한 설명은 데이타베이스 문서를 참조하기 바랍니다.

Warning 지속적인 접속을 사용할때 두가지 추가적인 경고를 염두에 두고 있어야 한다 한가지는 지속적인 접속에서 테이블 락킹(locking)을 사용할때이다. 스크립트가 어떤 이유로 락을 풀수 없을때, 같은 접속을 사용하는 다음 스크립트는 무한정 block될것이고 이 경우에는 httpd 서버나 데이터베이스 서버를 재시작시켜야 할수도 있다. 다른 한가지는 트랜잭션을 사용할때이다. 트랜잭션 블록은 그 트랜잭션 블록이 수행되기 전에 스크립트가 수행을 종료하면 그 접속을 사용하는 다음 스크립트에 이월하게 된다. 각각의 경우에, register_shutdown_function()을 사용하여 테이블 unlock하거나 트랜잭션을 롤백하는 해제 함수를 등록 할수 있다. 이런 문제를 완전히 회피하기 위한 더 좋은 방법은 지속적인 접속을 사용하는 스크립트에서 테이블 락이나 트랜젝션을 사용하지 않는 것이다 (어느 곳에서는 그것을 사용할수 있다)

중요한 요약입니다. 영구 연결은 일반 연결에 대한 일대일 매핑을 갖도록 설계되었습니다. 즉, 항상 영구 연결을 비영구 연결로 교체할 수 있어야 하며 스크립트 동작 방식은 변경되지 않습니다. 스크립트의 효율성은 변경될 수 있지만(아마도) 변경될 수 있지만 동작은 변경되지 않습니다!

ibase_pconnect(), ocilogon(), odbc_pconnect(), oci_pconnect(), pfsockopen()pg_pconnect()도 참조하십시오.