php에서 mysqli_stmt :: attr_get은 준비된 명령문 속성의 값을 얻는 데 사용되는 함수입니다. 이 기능은 일반적이지 않지만, 중간 계층의 데이터베이스 통신 상태를 성능 조정하거나 진단하는 것과 같은 특정 응용 프로그램 시나리오에서 문의 내부 상태 또는 구성 정보를 읽는 데 사용될 수 있습니다. 다중 연결 환경 (예 : 여러 데이터베이스 연결 처리 또는 동시에 연결 풀 사용) 에서이 기능을 올바르게 사용하는 것이 특히 중요합니다. 아래에서는 여러 관점에서 mysqli_stmt :: attr_get을 사용할 때주의를 기울여야하는 몇 가지 주요 문제를 분석합니다.
MySQLI 아키텍처에서 MySQLI_STMT 객체는 특정 MySQLI 연결에 바인딩됩니다. 새 연결을 만들 때 :
$conn = new mysqli("localhost", "user", "password", "database");
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
이때 $ stmt는 $ conn 에 명시 적으로 의존합니다. 이것은 다른 연결에서 $ stmt를 재사용 할 수 없으며 다른 연결에서 생성 된 문에 $ stmt 속성을 사용할 수 없음을 의미합니다. 이는 여러 연결 (예 : 여러 다른 호스트 또는 읽기 쓰기 분리 된 마스터 슬레이브 데이터베이스)에서 특히 중요하며 논리적 오류 또는 널 값 예외로 쉽게 이어질 수 있습니다.
PHP 자체는 단일 스레드를 실행하지만 FPM 모드 또는 비동기 프레임 워크에서 여러 요청이 다른 연결을 동시에 작동 할 수 있습니다. MySQLI 확장은 스레드-안전 (PHP 컴파일 중에 스레드-안전 지원이 활성화 된 경우)이지만 MySQLI_STMT :: ATT_GET에는 교차 연결 상태 가시성이 없습니다. 연결에서 attr_get을 호출하면 읽기 결과는 연결 컨텍스트 만 나타내며 전역 참조의 유의성이 없습니다.
attr_get () 메소드가 지원하는 속성 키는 매우 제한적이며 이러한 속성의 동작은 MySQL 또는 MariadB의 버전에 따라 다를 수 있습니다. 예를 들어 다음 코드를 사용하는 경우 다음과 같습니다.
$value = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
커서 유형 (예 : mysqli_cursor_type_read_only )을 읽을 것으로 예상되지만, 기본 드라이버 또는 버전이 속성을 지원하지 않으면 반환 값이 허위 일 수 있으며 경고를 트리거 할 수 있습니다. 이를 위해서는 다중 연결, 다중 버전 데이터베이스 클러스터에 특별한주의가 필요하며 가능한 모든 데이터베이스 동작을 테스트해야합니다.
연결이 실패하거나 적극적으로 닫힌 후에도 $ STMT 변수가 여전히 존재하더라도 기본 핸들이 유효하지 않습니다. 현재 attr_get ()을 호출하면 False가 반환되고 오류가보고 될 수 있습니다. 예를 들어:
$conn->close();
$value = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE); // 실패하다
높은 동시성 환경에서는 연결이 일시적으로 재활용되면 (연결 풀의 "임대료"메커니즘과 같은) 이러한 문제는 더 숨겨 질 수 있습니다. 따라서 attr_get을 호출하기 전에 연결을 사용할 수 있는지 확인해야합니다.
attr_get () 는 읽기 전용 함수이지만 특정 속성 값을 읽으면 일부 클라이언트 버퍼링 메커니즘을 초기화하는 것과 같은 암시 적 동작이 발생할 수 있습니다. 이 동작은 공식 문서에서 명확하지 않을 수 있지만 특정 구현에서 발생할 수 있습니다. 따라서 주요 비즈니스 논리에서 자주 전화를 피하기 위해 Att_get () 사용을 진단 코드에 제한하는 것이 좋습니다.
다음은 MySQLI_STMT :: ATTR_GET를 사용하여 커서 유형을 읽는 예입니다.