PHP를 사용하여 MySQL 데이터베이스를 조작 할 때 MySQLI Extension은 코드의 가독성과 유지 가능성을 향상시키기위한 객체 지향 인터페이스를 제공합니다. 그 중에서 MySQLI_STMT 클래스는 전처리 문을 실행하는 핵심 구성 요소입니다. 높은 동시성 또는 최적화 성능이 필요한 시나리오에서 개발자는 종종 데이터베이스 연결을 반복적으로 설정하는 오버 헤드를 피하기 위해 지속적인 연결을 사용하도록 선택합니다.
이러한 맥락에서 MySQLI_STMT :: ATT_GET 메소드는 어떻게 수행합니까? 이 기사는이 문제에 대해 깊이 논의 할 것입니다.
mysqli_stmt :: attr_get은 mysqli_stmt 클래스의 메소드입니다. 예를 들어:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$timeout = $stmt->attr_get(MYSQLI_STMT_ATTR_QUERY_TIMEOUT);
이 메소드는 종종 동적 조정 또는 디버그 최적화를 위해 쿼리 타임 아웃 ( mysqli_stmt_attr_query_timeout )과 같은 속성 값을 얻는 데 사용됩니다.
요청이 완료된 시점은 데이터베이스 연결을 닫지 않고 다음 요청을 재사용하기위한 프로세스에서 연결을 유지하는 경우입니다. PHP에서, 영구 연결은 일반적으로 p : prefix로 호스트 이름을 접두사로하여 달성됩니다.
$mysqli = new mysqli("p:m66.net", "user", "password", "dbname");
이는 특히 고주파 액세스가있는 응용 프로그램의 경우 자주 연결 및 데이터베이스 연결로 인한 성능 손실을 크게 줄일 수 있습니다.
많은 테스트 및 커뮤니티 피드백에 따르면 MySQLI_STMT :: ATTR_GET는 지속적인 연결 환경에서 비 연개 연결과 거의 동일하게 작동합니다. 즉, 지속 메커니즘에 의해 방해받지 않고 지정된 속성의 현재 값을 정확하게 반환 할 수 있습니다.
그러나 다음 사항에 주목해야합니다.
속성 값의 범위는 여전히 현재 명령문 객체 <br>로 제한됩니다 . 지속적인 연결이든 아니든 Attr_get을 통해 얻은 속성은 현재 MySQLI_STMT 인스턴스에만 적용되며 다른 문 또는 전역 설정에 영향을 미치지 않습니다.
준비 할 때마다 새로운 문장 개체가 여전히 생성됩니다 <br> 연결이 지속적이더라도 시스템은 repar ()를 호출 할 때 여전히 새로운 문장 개체를 생성합니다. attr_get은 객체의 속성을 가져 오므로 이전 요청의 상태는 남아 있지 않습니다.
지속적인 연결로 직접 캐시 효과가 없습니다
Attr_get 은 본질적으로 현재 명령문 객체의 상태를 읽고 있으며 서버 상태 캐시가 포함되지 않습니다. 따라서 연결이 다중화 되더라도 실제 설정에 따라 속성 값이 여전히 적용됩니다. 예를 들어, mysqli_stmt_attr_update_max_length 속성을 설정하면 준비하기 전에 명시 적으로 설정해야하며 "상속"에 대한 지속적인 연결에 의존 할 수 없습니다.
Attr_get 자체는 가벼운 작업이지만 지속적인 연결 환경에서는 명령문 핸들이 닫히지 않은 것과 같은 자원이 제 시간에 해제되지 않아 메모리 사용이 증가 할 수 있습니다. 따라서 권장됩니다.
명령문 객체를 사용한 후에 는 $ stmt-> close ()를 호출하십시오.
루프에서 미공개 전처리 진술을 많이 사용하지 마십시오.
Attr_get 과 Att_set을 결합하여보다 세련된 명령문 제어를 달성하여 쿼리 효율성을 향상시킵니다.
전반적으로 MySQLI_STMT :: ATTR_GET는 호환성이나 행동 적 차이없이 지속적으로 연결된 연결에서 안정적이고 일관되게 수행됩니다. 개발자는 attr_get을 사용하여 명령문 속성을 얻는 동안 지속적인 연결을 사용하여보다 유연한 데이터베이스 작동 로직을 달성하도록 보장 할 수 있습니다.
그러나 지속적인 연결을 사용할 때는 성능 장점을 진정으로 활용하고 예기치 않은 메모리 또는 연결 누출 문제를 피하기 위해 자원 관리 및 상태 청소에 추가주의를 기울여야합니다.