소켓 기반 프로그래밍에 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 ()는 실패시 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 또는 기타 중앙 집중식 로깅 체계를 사용하여 관찰 가능성을 더욱 향상시키는 것이 좋습니다.