현재 위치: > 최신 기사 목록> Socket_Accept ()에 의해 오류 코드를 포착하고 로그를 던지는 방법

Socket_Accept ()에 의해 오류 코드를 포착하고 로그를 던지는 방법

M66 2025-05-22

소켓 기반 프로그래밍에 PHP를 사용하는 경우 Socket_accept ()는 클라이언트의 연결을 수락하는 핵심 기능입니다. 그러나 함수 호출이 실패하면 오류가 발생하여 프로그램이 깨지거나 예측할 수없는 동작이 발생할 수 있습니다. 따라서 이러한 오류를 잡아서 로그에 기록하는 것은 디버깅 및 작동 및 유지 보수에 매우 필요합니다.

이 기사는 Socket_accept () 함수의 오류를 포착하는 방법을 자세히 소개하고 로그 파일에 로그인합니다.

기본 예

기본 소켓 서버 예는 다음과 같습니다.

 <?php

$host = '0.0.0.0';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    error_log("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

if (!socket_bind($socket, $host, $port)) {
    error_log("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

if (!socket_listen($socket, 5)) {
    error_log("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

Socket_Accept () 오류를 잡습니다

Socket_accept ()는 실패시 False를 반환합니다. 오류 코드를 포착하고 로그를 기록하려면 다음과 같이 처리 할 수 ​​있습니다.

 while (true) {
    $clientSocket = @socket_accept($socket);
    if ($clientSocket === false) {
        $errCode = socket_last_error($socket);
        $errMsg = socket_strerror($errCode);
        error_log("socket_accept() failed with error [$errCode]: $errMsg\n", 3, "/var/log/php_socket_error.log");

        // 필요에 따라 루프를 계속하거나 종료하도록 선택할 수 있습니다.
        continue;
    }

    // 연결을 수신 한 후 논리 처리
    $msg = "Hello from server on http://m66.net\n";
    socket_write($clientSocket, $msg, strlen($msg));
    socket_close($clientSocket);
}

이 코드에서 :

  • @ 연산자는 socket_accept () 가 던진 기본 경고를 억제하는 데 사용됩니다.

  • socket_last_error () 마지막 소켓 작동의 오류 코드를 가져옵니다.

  • socket_strerror ()는 오류 코드를 사람이 읽을 수있는 문자열로 변환합니다.

  • error_log ()/var/log/php_socket_error.log 파일에 오류를 씁니다.

참고 : 로그 파일 경로에 쓸 수있는 권한이 있는지 확인하고 로그 파일의 상위 디렉토리가 존재하는지 확인하십시오.

가독성과 유지 보수를 향상시킵니다

오류 로그인을 멀티플렉싱 및 통합 형식 출력을위한 함수로 캡슐화 할 수도 있습니다.

 function log_socket_error($socket, $context = '') {
    $errCode = socket_last_error($socket);
    $errMsg = socket_strerror($errCode);
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[$timestamp] [$context] Error [$errCode]: $errMsg\n";
    error_log($logEntry, 3, "/var/log/php_socket_error.log");
}

사용 방법은 다음과 같습니다.

 $clientSocket = @socket_accept($socket);
if ($clientSocket === false) {
    log_socket_error($socket, 'socket_accept');
    continue;
}

결론

위의 방법을 통해 Socket_accept ()를 사용하여 서버 사일런트 고장 또는 디버깅 어려움을 피하기 위해 효과적으로 오류를 기록하고 기록 할 수 있습니다. 동시에 파일에 로그를 작성하면 후속 작동 및 유지 보수 점검 및 자동 모니터링 시스템의 통합이 용이 해집니다. 실제 생산 환경에서는 또한 유사한 ELK 또는 기타 중앙 집중식 로깅 체계를 사용하여 관찰 가능성을 더욱 향상시키는 것이 좋습니다.