현재 위치: > 최신 기사 목록> 효율성을 향상시키기 위해 mysqli :: get_charset의 결과를 캐시하는 방법은 무엇입니까?

효율성을 향상시키기 위해 mysqli :: get_charset의 결과를 캐시하는 방법은 무엇입니까?

M66 2025-05-18

MySQL Extension은 PHP를 사용하여 MySQL 데이터베이스를 조작 할 때 매우 일반적인 도구입니다. 때로는 현재 연결에서 사용되는 문자 세트 정보를 얻으려면 $ mysqli-> get_charset ()을 호출해야합니다.

get_charset () 자체는 데이터베이스를 쿼리하는 것만 큼 시간이 많이 걸리지 않지만 고주파 요청 또는 루프에서 자주 호출되는 경우에도 불필요한 오버 헤드를 가져올 수 있습니다. 성능을 최적화하기 위해 반복적 인 통화를 피하기 위해 get_charset () 의 결과를 캐시하는 것을 고려할 수 있습니다.

이 기사에서는 mysqli :: get_charset () 함수의 결과를 캐싱하여 데이터베이스 작업의 효율성을 향상시키는 방법을 설명합니다.

mysqli :: get_charset () 란 무엇입니까?

mysqli :: get_charset () 함수는 Charset , Collation , Comment 등과 같은 현재 연결에 사용되는 문자 세트 정보가 포함 된 객체를 반환합니다.
예를 들어:

 $mysqli = new mysqli('localhost', 'user', 'password', 'database');
$charsetInfo = $mysqli->get_charset();
echo $charsetInfo->charset;  // 출력 예 ::utf8mb4

대부분의 경우 문자 세트가 일반적으로 연결된 후에는 변경되지 않기 때문에 매번 호출 할 필요가 없습니다.

왜 캐시?

복잡한 응용 프로그램, 특히 대형 프레임 워크 또는 높은 동시성 시나리오에서 코드가 각 데이터베이스 작업에서 한 번 get_charset ()을 호출하면 많은 반복 된 객체 생성 및 기능 호출이 생성되어 CPU 및 메모리 리소스를 낭비하게됩니다.

간단한 캐싱 (예 : 정적 변수, 글로벌 변수, 싱글 톤 모드)을 사용하면이 정보를 한 번만 얻은 다음 스크립트 라이프 사이클 전체에서 재사용 할 수 있습니다.

캐시 구현 예

간단한 구현 솔루션은 다음과 같습니다.

 class DatabaseConnection {
    private $mysqli;
    private $charsetInfo = null;

    public function __construct($host, $user, $password, $database) {
        $this->mysqli = new mysqli($host, $user, $password, $database);

        if ($this->mysqli->connect_error) {
            die('연결이 실패했습니다:' . $this->mysqli->connect_error);
        }
    }

    public function getCharsetInfo() {
        if ($this->charsetInfo === null) {
            $this->charsetInfo = $this->mysqli->get_charset();
        }
        return $this->charsetInfo;
    }

    public function query($sql) {
        return $this->mysqli->query($sql);
    }

    public function close() {
        $this->mysqli->close();
    }
}

// 사용의 예
$db = new DatabaseConnection('localhost', 'user', 'password', 'database');

// 첫 번째 전화,실행됩니다 get_charset()
$charset = $db->getCharsetInfo();
echo '현재 문자 세트:' . $charset->charset . '<br>';

// 후속 통화,캐시 된 값을 직접 사용하십시오
$charsetAgain = $db->getCharsetInfo();
echo '캐릭터를 다시 설정하십시오(은닉처):' . $charsetAgain->charset . '<br>';

// 다른 쿼리를 수행하십시오
$result = $db->query('SELECT * FROM users');
while ($row = $result->fetch_assoc()) {
    echo $row['username'] . '<br>';
}

$db->close();

캐싱 사용의 이점

  1. 기능 호출 오버 헤드 감소 <br> 특히 루프 또는 높은 동시성 시나리오에서 자주 get_charset ()을 호출하는 횟수를 줄입니다.

  2. 코드 유지 보수성 향상 <br> 캐릭터 세트 정보 중앙 관리. 향후 캐시 정책을 확장하거나 수정 해야하는 경우 한 장소 만 수정하면됩니다.

  3. 디버깅 및 모니터링하기 쉬운 <br> 캐시 레이어는 로그, 디버그 출력 또는 캐시 실패 메커니즘을 쉽게 추가 할 수 있습니다.

고급 최적화 제안

응용 프로그램이 배포되거나 긴 연결 (예 : Swoole, Workerman 등) 인 경우 Cache를 Connection Pool 또는 Global Manager로 확장하는 것이 좋습니다.

예를 들어, APCU, Memcached 또는 Redis를 사용하여 연결 구성을 캐시하고 필요할 때 프로세스 전체에서 공유하여 초기화 비용을 더욱 줄일 수 있습니다.

동시에 참고 : 다중 스레드 또는 다중 프로세스 시나리오에서 정적 변수 및 객체 속성의 캐시는 현재 프로세스에서만 유효하며 전략은 응용 프로그램 아키텍처와 조합하여 조정해야합니다.