현재 위치: > 최신 기사 목록> mysqli :: 킬 기능을 사용할 때 연결 닫기로 인한 예외를 피하는 방법

mysqli :: 킬 기능을 사용할 때 연결 닫기로 인한 예외를 피하는 방법

gitbox 2025-06-07

PHP를 사용하여 MySQL 데이터베이스를 작동 할 때 MySQLI :: Kill 메소드는 특정 연결 스레드를 종료하는 데 사용됩니다. 그러나 개발자가 사용하는 동안 문제가 발생할 수 있습니다. kill ()을 호출 한 후 현재 연결이 비정상적으로 중단됩니까? 이 기사는 행동 원칙을 분석하고 연결 예외를 피하는 올바른 방법을 제공합니다.

mysqli :: 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 的연결하다

이 방법은 관리 연결이 항상 정상으로 유지되도록하고 오해로 인해 자신의 세션이 종료되지 않도록합니다.

비정상적인 인터럽트를 피하기위한 제안

  1. kill ()을 사용하여 자신을 처치하지 마십시오 . $ mysqli-> thread_id를 사용하여 ID가 ​​현재 연결 대상 대상 연결인지 확인하십시오.

  2. 연결 컨텍스트 구별 : 여러 데이터베이스 연결을 사용할 때는 연결 객체의 이름을 명확하게 이름을 지정하여 목적을 구별하는 것이 좋습니다.

  3. 예외 예외 : 연결이 연결되면 결함 방해 처리가 수행 될 수 있도록 오류 처리 메커니즘을 사용하여 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 () 의 기능을 최대한 활용할 수 있습니다.