PHP 프로그래밍에서 MySQLI Extension은 MySQL 데이터베이스와 상호 작용하는 일반적인 방법입니다. SQL 쿼리를 디버그하기 위해 MySQLI는 상세한 디버깅 정보를 출력 할 수있는 디버그 방법을 제공합니다. 그러나 경우에 따라 mysqli :: debug를 활성화하면 웹 사이트의 성능이 크게 감소 할 수 있습니다. 그렇다면 왜 이런 일이 발생합니까? 이 기사는 MySQLI :: Debug를 켜고 나서 웹 사이트가 속도가 느려지는 이유를 자세히 분석합니다.
mysqli :: debug는 mysqli 디버깅 모드를 활성화하는 데 사용되는 메소드입니다. 쿼리를 실행할 때 데이터베이스 연결, 쿼리 실행, 오류 정보 및 기타 내부 프로세스에서보다 자세한 로그를 얻을 수 있습니다. 정보를 디버깅하여 개발자는 데이터베이스 작업에서 잠재적 인 문제를보다 쉽게 발견 할 수 있습니다.
mysqli::debug("trace");
위의 방법을 호출하면 모든 데이터베이스 작동 로그가 지정된 위치 (일반적으로 PHP 오류 로그)로 출력됩니다. 그러나 웹 사이트에서 성능 문제를 일으킬 수있는 세부적인 로그 출력입니다.
로그 출력에 대한 추가 오버 헤드
mysqli :: debug를 활성화하면 mysqli 확장자는 각 쿼리와 그 실행 시간을 녹음 하고이 정보를 로그 파일에 출력합니다. 각 요청에 대해 MySQLI는 쿼리 데이터, 실행 상태, 오류 정보 등을 캡처해야합니다. 이러한 작업 자체에는 일정량의 컴퓨팅 리소스가 필요하며 로그의 출력은 I/O 작동 시간을 더 소비 할 것입니다. 특히 많은 수의 쿼리가 실행되면 이러한 추가 오버 헤드가 매우 중요 해져서 연장 된 응답 시간이 발생합니다.
샘플 코드 :
mysqli::debug("trace");
$connection = new mysqli('m66.net', 'user', 'password', 'database');
$result = $connection->query("SELECT * FROM large_table");
쿼리가 실행될 때마다 MySQLI :: 디버그는 자세한 디버깅 정보를 기록하고 로그 파일에 출력합니다. 이는 특히 고주파 요청 사이트에서 눈에 띄고 응답 시간이 증가 할 수 있습니다.
데이터베이스 연결 및 쿼리의 빈번한 디버깅
디버그 모드를 켜면 데이터베이스가 연결되거나 쿼리가 실행될 때마다 관련 정보가 기록됩니다. 교통량이 많은 웹 사이트를 방문하면 데이터베이스 연결 및 쿼리 작업이 자주 발생하므로 디버그 정보의 출력이 성능 병목 현상이됩니다. SQL 쿼리가 수행 될 때마다 MySQLI Extension은 SQL 작업 자체를 수행 할뿐만 아니라이 정보를 로그 파일로 전달하여 추가 지연이 추가됩니다.
디버깅 정보는 데이터베이스의 부담을 증가시킵니다
mysqli :: 디버그는 디버그 정보 만 출력하지만 데이터베이스의 성능에 간접적으로 영향을 줄 수 있습니다. 예를 들어, 디버그 로그가 너무 커지면 너무 많은 I/O 작업이 발생하여 데이터베이스의 일반 쿼리 응답에 영향을 줄 수 있습니다. 이는 또한 데이터베이스 자체의 성능에 대한 압력입니다. 특히 데이터베이스로드가 높을 때 디버깅 정보의 처리 및 저장은 리소스의 일반적인 데이터베이스 작업과 경쟁 할 수 있습니다.
디버깅 정보는 디스크 공간을 차지합니다
디버깅이 활성화 된 후 특히 SQL 쿼리가 자주 실행될 때 로그 파일의 크기가 점차 증가합니다. 너무 큰 로그 파일은 서버 디스크 공간을 차지할뿐만 아니라 로그 읽기 및 쓰기 시간을 확장 할 수도 있습니다. 디스크 공간이 충분하지 않은 경우 다른 시스템 성능 문제로 이어질 수도 있습니다.
차단 및 동기화 문제
일부 디버그 정보는 로그 파일에 동기식으로 기록되므로 디버그 정보를 녹화 할 때 프로그램이 차단 될 수 있습니다. 이것은 일반적으로 매우 작은 대기 시간이지만 동시성이 높은 경우 이러한 대기 시간이 축적되어 성능 저하가 상당한 성능 저하를 유발합니다.
개발 환경에서만 디버깅을 켜십시오
최선의 방법은 개발 또는 디버그 환경에서만 MySQLI :: 디버그를 활성화하고 생산 환경에서 끄는 것입니다. PHP의 환경 변수를 확인하여 디버그 모드를 활성화할지 여부를 결정할 수 있습니다.
샘플 코드 :
if ($_SERVER['SERVER_NAME'] === 'm66.net') {
mysqli::debug("trace");
}
이러한 방식으로, 생산 환경에서 정보 디버깅이 출력되지 않으므로 성능 저하를 피할 수 있습니다.
다른 디버깅 도구를 사용하십시오
MySQLI :: Debug 외에도 XDEBUG 또는 데이터베이스 쿼리 분석 도구 (예 : MySQL Slow Query Log )와 같은 다른 성능 모니터링 도구를 사용할 수도 있습니다. 이러한 도구는 성능에 크게 영향을 미치지 않으면 서 디버그 정보를 얻는 데 도움이 될 수 있습니다.
로그 파일 크기를 제한합니다
디버그 로그를 사용해야하는 경우 로그 파일을 정기적으로 회전시키는 것을 고려하여 너무 커서 디스크 공간을 너무 많이 차지하십시오. PHP에 대한 log_errors_max_len 구성 옵션을 설정하여 로그 항목의 최대 길이를 제한하거나 로그 관리 도구를 사용하여 로그 파일을 관리 할 수 있습니다.
쿼리 성능을 최적화합니다
마지막으로 데이터베이스 쿼리 자체를 최적화하는 것이 매우 중요합니다. 불필요한 쿼리를 줄이고 인덱스 및 기타 수단을 사용하여 쿼리 문을 최적화함으로써 데이터베이스에 대한 부담이 줄어들어 디버깅 정보의 성능 영향을 간접적으로 줄일 수 있습니다.
MySQLI :: Debug를 켜면 특히 동시 액세스 또는 빈번한 데이터베이스 작업이 수행 될 때 웹 사이트 성능에 영향을 미칩니다. 디버그 정보의 기록 및 출력은 추가 계산 및 I/O 작동 오버 헤드를 추가하여 응답 시간에 영향을 미칩니다. 따라서 개발자는 프로덕션 환경에서 디버그 모드를 끄고 다른 도구를 사용하여 디버깅 중에 성능 분석 및 오류 정보를 얻는 것이 좋습니다. 이는 웹 사이트의 정상적인 운영을 보장 할뿐만 아니라 불필요한 성능 손실도 피합니다.