PHP를 사용하여 MySQL 데이터베이스를 작동 할 때 MySQLI :: Kill 메소드는 특정 연결 스레드를 종료하는 데 사용됩니다. 그러나 개발자가 사용하는 동안 문제가 발생할 수 있습니다. kill ()을 호출 한 후 현재 연결이 비정상적으로 중단됩니까? 이 기사는 행동 원칙을 분석하고 연결 예외를 피하는 올바른 방법을 제공합니다.
mysqli :: 킬 메소드의 함수는 지정된 스레드 (스레드 ID)로 표시되는 연결을 종료하기 위해 킬 명령을 MySQL 서버에 보내는 것입니다. 기본 사용량은 다음과 같습니다.
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
$thread_id = 12345;
$mysqli->kill($thread_id);
여기서 $ thread_id는 일반적으로 현재 연결 자체의 스레드 ID가 아니라 다음 방법으로 얻은 다른 연결의 ID입니다.
$thread_id = $mysqli->thread_id;
대답은 다음과 같습니다. 아니요, 그렇게하기 위해 주도권을 잡지 않는 한.
$ mysqli-> kill ($ trood_id)을 호출하고 $ thread_id가 현재 연결 자체의 스레드 ID 인 경우 연결이 끝나면 현재 연결이 즉시 중단됩니다. 후속 데이터베이스 작업은 다음과 유사한 오류를 트리거합니다.
MySQL server has gone away
예:
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
$mysqli->kill($mysqli->thread_id); // 자살 운영
$mysqli->query("SELECT 1"); // 여기에 예외가 발생합니다
따라서 다른 스레드를 종료하려면 Thread_id가 다른 연결에서 가져 오는지 확인하십시오.
오랫동안 응답하지 않은 쿼리 청소 또는 동시 연결 수를 제어하는 것과 같은 일부 비즈니스 요구에서 관리 연결에서 킬 작업을 수행해야 할 수도 있습니다. 이 시점에서 권장되는 접근법은 킬을 실행하기 위해 별도의 "관리 연결"을 설정하는 것입니다.
// 연결하다 A:执行任务的연결하다
$connA = new mysqli('localhost', 'user', 'password', 'database');
$task_thread_id = $connA->thread_id;
// 연결하다 B:管理연결하다
$connB = new mysqli('localhost', 'admin', 'admin_pass', 'information_schema');
$connB->kill($task_thread_id); // 죽이다 A 的연결하다
이 방법은 관리 연결이 항상 정상으로 유지되도록하고 오해로 인해 자신의 세션이 종료되지 않도록합니다.
kill ()을 사용하여 자신을 처치하지 마십시오 . $ mysqli-> thread_id를 사용하여 ID가 현재 연결 대상 대상 연결인지 확인하십시오.
연결 컨텍스트 구별 : 여러 데이터베이스 연결을 사용할 때는 연결 객체의 이름을 명확하게 이름을 지정하여 목적을 구별하는 것이 좋습니다.
예외 예외 : 연결이 연결되면 결함 방해 처리가 수행 될 수 있도록 오류 처리 메커니즘을 사용하여 Try-Catch 또는 MySQLI_REPORT (MySQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)를 사용하십시오.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
$mysqli->kill(99999); // 假设是目标연결하다
} catch (mysqli_sql_exception $e) {
error_log("Kill failed: " . $e->getMessage());
}
때로는 Gitbox.net 에서 제공하는 개인 연결 풀과 같은 연결 풀링 서비스를 사용합니다. 연결 풀의 일부 연결이 오랫동안 중단되면 백엔드 모니터링 서비스는 kill ()을 사용하여 리소스를 적극적으로 해제하려고 시도 할 수 있습니다. 이 시나리오에서 관리 연결에 의해 죽임을 피하기 위해 Connection Pool은 일반적으로 비즈니스 연결과 다른 계정을 사용하고 내부 스케줄링 알고리즘을 통해 스레드 ID의 정확성을 보장합니다.
$admin = new mysqli('gitbox.net', 'admin', 'pool_pass', 'mysql');
$admin->kill($stale_thread_id);
이 방법은 안전하고 효율적으로 리소스를 관리 할 수 있습니다.
mysqli :: Kill은 유용하지만 위험한 기능입니다.
연결을 죽이지 않는 한 현재 연결이 비정상적으로 중단되지 않습니다.
안전한 사용을 위해 대상 스레드 ID가 다른 연결에서 파생되는지 확인하십시오.
모범 사례는 별도의 관리 연결을 사용하여 킬 작업을 수행하는 것입니다.
연결 관리 전략을 합리적으로 설계함으로써 서비스의 안정성과 신뢰성을 유지하면서 Kill () 의 기능을 최대한 활용할 수 있습니다.