문제

저는 프로젝트의 데이터 액세스를 위해 PHP의 PDO 레이어를 사용하고 있는데, 이에 대한 내용을 읽어보니 영구 DB 연결에 대한 좋은 기본 지원 기능이 있다는 것을 알게 되었습니다.언제 사용해야 하는지/언제 사용해야 하는지 궁금합니다.CRUD가 많은 앱에서 성능상의 이점을 볼 수 있습니까?보안과 관련하여 고려해야 할 단점이 있습니까?

중요한 경우에는 MySQL 5.x를 사용하고 있습니다.

도움이 되었습니까?

해결책

이것을 대략적인 "규칙 세트"로 사용할 수 있습니다.

, 다음과 같은 경우 영구 연결을 사용합니다.

  • 데이터베이스에 액세스하는 애플리케이션/사용자는 거의 없습니다.동일한 호스트에서 200명의 서로 다른 사용자가 공유되므로 200개의 열린(아마도 유휴) 연결이 발생하지는 않습니다.
  • 데이터베이스가 네트워크를 통해 액세스하는 다른 서버에서 실행 중입니다.
  • (하나) 애플리케이션이 데이터베이스에 매우 자주 액세스합니다.

아니요, 다음과 같은 경우 영구 연결을 사용하지 마세요.

  • 애플리케이션은 한 시간에 100번만 데이터베이스에 액세스하면 됩니다.
  • 하나의 데이터베이스 서버에 액세스하는 많은 웹 서버가 있습니다.
  • 프리포크 모드에서 Apache를 사용하고 있습니다.각 하위 프로세스마다 하나의 연결을 사용하므로 상당히 빠르게 증가할 수 있습니다.(댓글의 @Powerlord를 통해)

특히 네트워크를 통해 데이터베이스에 액세스하는 경우 영구 연결을 사용하는 것이 상당히 빠릅니다.데이터베이스가 동일한 시스템에서 실행되는 경우에는 큰 차이가 없지만 여전히 조금 더 빠릅니다.그러나 이름에서 알 수 있듯이 연결은 지속적입니다.사용되지 않더라도 열려 있습니다.

문제는 "기본 구성"에서 MySQL이 1000개의 병렬 "개방 채널"만 허용한다는 것입니다.그 후에는 새 연결이 거부됩니다(이 설정을 조정할 수 있음).따라서 예를 들어 각각 100개의 클라이언트가 있는 20개의 웹 서버가 있고 각 서버가 시간당 단 하나의 페이지 액세스만 갖는다면 간단한 계산을 통해 데이터베이스에 대한 2000개의 병렬 연결이 필요하다는 것을 알 수 있습니다.그건 작동하지 않습니다.

Ergo:요청이 많은 애플리케이션에만 사용하세요.

다른 팁

간단히 말해서 내 경험에 따르면 지속적인 연결은 가능한 한 피해야 합니다.

mysql_close는 mysql_pconnect를 사용하여 생성된 연결에 대해 아무런 작업도 수행하지 않는다는 점에 유의하십시오.이는 클라이언트가 마음대로 영구 연결을 닫을 수 없음을 의미합니다.해당 연결은 다음보다 오랫동안 연결에서 활동이 발생하지 않으면 mysqldb 서버에 의해 닫힙니다. wait_timeout.만약에 wait_timeout 큰 값(예: 30분)이면 mysql db 서버에 쉽게 도달할 수 있습니다. 최대_연결 한계.이러한 경우 mysql db는 향후 연결 요청을 수락하지 않습니다. 이때 호출기에서 신호음이 울리기 시작합니다.

도달하지 않으려면 최대_연결 제한, 영구 연결을 사용하려면 다음 변수의 신중한 균형이 필요합니다...

  1. 한 호스트의 Apache 프로세스 수
  2. Apache를 실행하는 총 호스트 수
  3. mysql db 서버의 wait_timout 변수
  4. mysql db 서버의 max_connections 변수
  5. 다시 생성되기 전에 하나의 Apache 프로세스에서 처리한 요청 수

따라서 충분히 숙고한 후 영구 연결을 사용하시기 바랍니다.지속적인 연결을 통해 얻을 수 있는 작은 이득을 위해 복잡한 런타임 문제를 발생시키고 싶지 않을 수도 있습니다.

데이터베이스에 대한 연결을 생성하는 것은 상당히 비용이 많이 드는 작업입니다.지속적인 연결은 좋은 생각입니다.ASP.Net 및 Java 세계에는 "연결 풀링"이 있는데 이는 거의 동일하며 좋은 아이디어입니다.

IMO, 이 질문에 대한 실제 대답은 앱에 가장 적합한 것이 무엇이든입니다.영구 연결과 비영구 연결을 모두 사용하여 앱을 벤치마킹하는 것이 좋습니다.

매기 넬슨 @ 객관적 지향 이에 대해 8월에 게시되었으며 로버트 스와트아웃 몇 가지 어려운 숫자가 포함된 게시물을 작성했습니다.둘 다 꽤 잘 읽힌다.

내 소견에:

웹 개발을 위해 PHP를 사용하는 경우 대부분의 연결은 페이지가 실행되는 동안에만 "활성"됩니다.지속적인 연결은 세션이나 그와 유사한 작업에 배치해야 하므로 많은 오버헤드가 발생합니다.

페이지 실행이 끝날 때 끊어지는 단일 비지속적 연결은 99%의 경우 정상적으로 작동합니다.

나머지 1%의 경우에는 아마도 앱에 PHP를 사용해서는 안 되며 완벽한 솔루션은 없습니다.

같은 질문을 하려고 했는데 같은 질문을 다시 하기보다는 제가 찾은 몇 가지 정보를 추가하겠습니다.

최신 mysqli 확장에는 영구 데이터베이스 연결을 사용하는 옵션도 포함되어 있지 않다는 점도 주목할 가치가 있습니다.

현재는 여전히 영구 연결을 사용하고 있지만 가까운 시일 내에 비영구 연결로 전환할 계획입니다.

일반적으로 비영구 연결을 사용해야 하는 경우가 있으며 DB 연결 설계에 단일 패턴을 적용하는 것이 좋습니다(컨텍스트에서 지속적 연결을 사용하는 것이 상대적으로 장점이 적다면).

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