현재 위치: > 최신 기사 목록> 풀 관리 연결에서 Socket_clear_error ()로 사용할 수없는 연결을 확인하고 복원하는 방법은 무엇입니까?

풀 관리 연결에서 Socket_clear_error ()로 사용할 수없는 연결을 확인하고 복원하는 방법은 무엇입니까?

M66 2025-06-15

동시 네트워크 응용 프로그램에서 연결 풀링은 일반적으로 사용되는 최적화 방법입니다. 연결을 자주 생성하고 파괴하는 오버 헤드를 줄이고 리소스 활용 및 응용 프로그램 성능을 향상시킬 수 있습니다. 그러나 연결 풀의 연결을 항상 사용할 수있는 것은 아닙니다. 특히 소켓 기반 연결은 네트워크 문제, 서버 종료 또는 타임 아웃 등으로 인해 사용할 수 없게 될 수 있습니다.

이 기사는 PHP에서 Socket_clear_error () 함수를 사용하여 연결 풀에서 사용할 수없는 소켓 연결을 감지하고 이러한 연결의 복구를 실현하여 연결 풀의 견고성 및 안정성을 보장하는 방법을 소개합니다.


연결 풀에서 소켓 연결 문제

일반적으로 연결 풀은 오픈 소켓 연결 세트를 유지하여 이러한 연결을 멀티 플렉스하여 빈번한 연결 설정 비용을 피합니다. 그러나 네트워크가 불안정하거나 서버가 비정상적으로 닫히면 일부 연결이 실패 할 수 있습니다. 제 시간에 감지 및 처리되지 않으면 이러한 "죽은"연결을 사용하면 요청이 실패하고 비즈니스에 영향을 미칩니다.

전통적인 접근 방식은 하트 비트를 보내거나 연결을 사용하기 전에 연결이 활성화되어 있는지 확인하도록 요청하는 것입니다. 그러나이 방법은 추가 네트워크 부담을 추가합니다. 또 다른 아이디어는 PHP의 socket_clear_error () 함수를 사용하여 소켓의 오류 상태를 감지하는 것입니다.


php의 socket_clear_error ()

Socket_clear_error () 는 PHP 소켓 확장에서 소켓 오류 상태를 지우기위한 함수입니다. 현재 소켓의 오류 코드를 반환하고 사용 후 오류 상태를 지 웁니다. 반환 된 오류 코드를 기반으로 소켓이 정상인지 확인할 수 있습니다.

함수 시그니처 예제는 다음과 같습니다.

 int socket_clear_error(resource $socket)

반품 값 :

  • 0 : 소켓에 오류가없고 연결이 정상임을 나타냅니다.

  • 비 0 정수 : 소켓 오류가 발생하고 연결을 사용할 수 없음을 나타냅니다.


socket_clear_error ()로 연결 가용성 확인의 예

다음은 Socket_clear_Error ()를 사용하여 연결 풀의 소켓 연결이 건강한지 여부를 감지하는 방법을 설명하는 샘플 코드입니다.

 <?php

class SocketConnectionPool {
    private $pool = [];

    public function __construct($size = 5) {
        for ($i = 0; $i < $size; $i++) {
            $this->pool[] = $this->createConnection();
        }
    }

    private function createConnection() {
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_connect($socket, 'm66.net', 80);
        return $socket;
    }

    // 연결이 유효한지 확인하십시오
    private function isSocketHealthy($socket) {
        $errorCode = socket_clear_error($socket);
        return $errorCode === 0;
    }

    // 연결 풀에서 건강한 연결을 받으십시오
    public function getConnection() {
        foreach ($this->pool as $key => $socket) {
            if ($this->isSocketHealthy($socket)) {
                return $socket;
            } else {
                // 연결을 사용할 수 없습니다,닫고 교체하십시오
                socket_close($socket);
                $this->pool[$key] = $this->createConnection();
                return $this->pool[$key];
            }
        }
        // 사용 가능한 연결이없는 경우,새로운 것을 만들어냅니다
        $newSocket = $this->createConnection();
        $this->pool[] = $newSocket;
        return $newSocket;
    }

    public function closeAll() {
        foreach ($this->pool as $socket) {
            socket_close($socket);
        }
        $this->pool = [];
    }
}

// 사용의 예
$pool = new SocketConnectionPool(3);
$socket = $pool->getConnection();

if ($socket) {
    $request = "GET / HTTP/1.1\r\nHost: m66.net\r\nConnection: Close\r\n\r\n";
    socket_write($socket, $request, strlen($request));
    $response = socket_read($socket, 2048);
    echo $response;
}

$pool->closeAll();

?>

코드 구문 분석

  1. 연결 풀 초기화 <br> 생성자에서 다중 소켓 연결을 생성하고 연결 풀을 초기화하십시오.

  2. 연결 건강을 감지하십시오
    issockethealthy ()socket_clear_error ()를 호출하여 소켓 오류 코드를 가져 오면 0은 연결이 정상임을 의미합니다.

  3. 연결을 얻으십시오
    getConnection ()은 연결 풀을 가로 지릅니다. 사용할 수없는 연결이 발생하면 이전 연결을 닫고 새로운 대체 연결을 만들어 리턴 된 연결이 건강 상태인지 확인하십시오.

  4. 연결 폐쇄 <br> 필요하지 않은 경우 CloseAll () 에게 전화하여 자원을 닫고 해제하십시오.


요약

socket_clear_error ()를 사용하면 소켓 연결의 오차 상태를 빠르게 감지 할 수 있습니다. 연결 풀 설계와 결합하여 사용할 수없는 연결을 효과적으로 발견하고 복원하여 응용 프로그램 안정성과 성능을 향상시킬 수 있습니다.

실제 프로젝트에서보다 강력한 연결 풀 관리 솔루션은 하트 비트 감지 및 시간 초과 제어와 같은 메커니즘과 함께 구축 할 수 있습니다. 이 기사가 PHP의 소켓 연결 풀에 대한 건강 검사를 이해하는 데 도움이되기를 바랍니다.