통합검색

PHP

[PHP] pdo를 class의 __construct(생성자) 로 연결하는 경우 인스턴스 여러개 만들어도 한번만 연결 되도록 하기

  • 2023.02.26 03:10:43


내가 직접 개발한 CMS를 실무에 잘 사용해 오다, 최근 비교적 복잡한 기능을 개발하다 치명적인 문제점을 발견하게 됐다.
mariadb를 pdo로 접속해서 php와 연동하여 사용하는데,
php 코드에서 필요할 때 마다 pdo접속 Class를 인스턴스로 매번 생성하여 사용한다.
(아래 예시)
 
$db = new PdoClass();
$db2 = new PdoClass();
$db3 = new PdoClass();
...

PdoClass() 함수는
__construct() (생성자 함수) 로 pdo에 자동 접속되도록 구성되어 있다. (new PDO)
즉, 위 코드대로 라면 pdo 접속이 3번 연달아 발생하게 되는 것이다.

오랜 기간 동안 pdo 중복 접속으로 인해 DB 성능이 저하되고 있다는 것을 간과하고 있었다.
(특정 웹페이지는 무려 20번 이상의 pdo 중복 연결이 이뤄지고 있었었으며, 페이지 로딩 시간은 500ms 에 달했다.)
특히나, 내가 운영중인 서비스의 경우 외부DB 서버를 이용하고 있어 체감되는 접속 지연은 배가 되었다.

지금이라도 발견 했으니 다행이라 생각한다.
기본 중의 기본을 실수해 버렸고, 기본 중의 기본인 방법으로 이를 해결했다.



최초 인스턴스 생성시
다수의 인스턴스가 생성 되어도 1개만 존재할 수 있는 static 변수에 pdo 객체를 저장한다.
이후 두번째 인스턴스 연결 부터는 static 변수에 저장된 객체가 있다면 중복 연결 하지 않고
기존의 pdo객체를 재활용 하게 된다.