여기에 설명 된 문제를 완화하는 방법을 자세히 설명하는 아래이 답변 을 읽으 십시오.
영구 연결을 수행하는 다른 PHP 데이터베이스 인터페이스와 마찬가지로 PDO를 사용하는 경우와 동일한 단점이 존재합니다. 데이터베이스 작업 중에 스크립트가 예기치 않게 종료되면 연결을 끊는 다음 요청이 죽은 스크립트가 중단 된 위치에서 처리됩니다. 연결은 PHP 수준이 아닌 프로세스 관리자 수준 (mod_php의 경우 Apache, FastCGI를 사용하는 경우 현재 FastCGI 프로세스 등)에서 열린 상태로 유지되며, PHP는 부모 프로세스에게 연결이 죽을 때 연결을 끊도록 지시하지 않습니다. 스크립트가 비정상적으로 종료됩니다.
사용 불능 스크립트 잠금 테이블 인 경우 해당 테이블은 연결이 끊어 지거나 연결을받는 다음 스크립트가 테이블 자체를 잠금 해제 할 때까지 잠금 상태로 유지됩니다.
교착 상태 스크립트가 트랜잭션 중간에있는 경우 교착 상태 타이머가 시작될 때까지 여러 테이블을 차단할 수 있으며 교착 상태 타이머는 문제를 일으키는 이전 요청 대신 새 요청을 종료 할 수 있습니다.
데드 스크립트가 트랜잭션 중간에있는 경우 해당 연결을받는 다음 스크립트도 트랜잭션 상태를 가져옵니다. 응용 프로그램 디자인에 따라 다음 스크립트가 실제로 기존 트랜잭션을 커밋하려고 시도하지 않을 수도 있고, 그렇지 않은 경우 커밋하거나하지 말아야 할 때 롤백 할 수도 있습니다.
이것은 빙산의 일각에 불과합니다. 모든 단일 스크립트 요청에 대해 더티 연결 후 항상 정리를 시도하면 어느 정도까지 완화 할 수 있지만 데이터베이스에 따라 고통이 될 수 있습니다. 스크립트에서 병목 현상을 일으키는 것으로 데이터베이스 연결 작성을 식별하지 않은 경우 ( xdebug 및 / 또는 xhprof를 사용하여 코드 프로파일 링을 수행 했음을 의미 함 ) 지속적인 연결을 솔루션으로 고려 해서는 안됩니다 .
또한 대부분의 최신 데이터베이스 (PostgreSQL 포함)에는 일반 바닐라 PHP 기반 영구 연결과 달리 즉각적인 단점이없는 연결 풀링을 선호하는 고유 한 방법이 있습니다.
요점을 명확히하기 위해 직장에서 지속적인 연결을 사용하지만 선택하지는 않습니다. 앱 서버에서 데이터베이스 서버로의 초기 연결이 정확히 3 초가 걸리는 이상한 연결 동작 이 발생 했습니다. 우리는 이것이 커널 버그라고 생각합니다. 우리는 문제가 무작위로 발생하여 요청시 재생산 할 수 없었기 때문에 문제 해결을 포기했고, 아웃소싱 한 IT 부서는이를 추적 할 수있는 구체적인 능력이 없었습니다.
어쨌든 창고의 직원들이 수백 개의 들어오는 부품을 처리 할 때 각 부품이 0.5 초가 아닌 3 초 반 걸리는 경우, 우리를 모두 납치하고 우리를 돕기 전에 조치를 취해야했습니다. 그래서 우리는 집에서 자란 ERP / CRM / CMS 괴물에서 약간의 비트를 뒤집었고 지속적인 연결의 모든 공포를 직접 경험했습니다. 겉보기에 무작위로 발생한 모든 미묘한 작은 문제와 기괴한 행동을 추적하는 데 몇 주가 걸렸습니다 . 사용자가 앱에서 부지런히 짜낸 일주일에 한 번 치명적인 오류가 잠긴 테이블, 버려진 트랜잭션 및 기타 불행한 이상한 상태를 떠나는 것으로 나타났습니다.
이 Sob-Story는 한 가지 중요한 점을 가지고 있습니다. 그것은 우리가 결코 깨지 않을 것으로 예상했던 것들을 모두 성능의 이름으로 깨뜨 렸습니다. 트레이드 오프는 그만한 가치가 없었으며 사용자의 폭동 없이도 정상적인 연결로 다시 전환 할 수있는 날을 간절히 기다리고 있습니다.