PHP를 사용하여 소켓 기반 서버 응용 프로그램을 작성할 때 Socket_accept ()는 클라이언트 연결을 수신하는 핵심 기능입니다. 그러나 일부 시나리오에서는 프로그램 로직이 올바른 경우에도 Socket_accept ()는 정상적으로 연결을받지 못할 수 있습니다. 이 기사에서는 Strace 및 Netstat 도구를 사용 하여이 문제를 신속하게 찾아서 해결하는 방법을 설명합니다.
다음은 Port 8080을 듣는 간단한 PHP 서버 프로그램입니다.
<?php
$host = '0.0.0.0';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server listening on $host:$port\n";
while (true) {
$client = socket_accept($socket);
if ($client === false) {
echo "Failed to accept connection\n";
continue;
}
$msg = "Hello from server\n";
socket_write($client, $msg, strlen($msg));
socket_close($client);
}
?>
socket_accept () 가 붙어 있거나 항상 False를 반환하면 시스템 도구를 사용하여 심층적 인 문제 해결을 수행해야합니다.
Strace 는 Linux의 시스템 통화 추적 도구입니다. 런타임시 PHP 스크립트에서 어떤 시스템 기본 기능을 호출하고 실행 결과를 직접 볼 수 있습니다.
예를 들어 PS를 사용하여 실행중인 PHP 프로세스 PID를 찾으십시오.
ps aux | grep php
Strace를 사용하여 프로세스에 연결하십시오.
strace -p <PID> -e trace=network
다음 동작이 출력에 존재하는지 확인하십시오.
accept (...) = -1 : 시스템 호출이 실패했으며 일반적으로 오류 코드 (예 : eagain , econnaborted 등)와 함께).
듣기 (...) 또는 바인딩 (...) 오류 : 포트가 점유되었거나 권한이 충분하지 않음을 의미 할 수 있습니다.
수락 요청 없음 () : 프로그램이 다른 곳에 고착 될 수 있습니다.
strace show acccept () 가 정상이지만 여전히 연결 액세스 권한이 없으면 네트워크 계층이나 방화벽에 문제가있을 수 있습니다.
Netstat 및 SS는 포트가 청취 상태에 있는지 여부와 연결이 설정되어 있는지 확인하는 데 사용될 수 있습니다.
netstat -tlnp | grep :8080
또는:
ss -tlnp | grep :8080
다음과 유사한 출력을 볼 수 있어야합니다.
tcp LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("php",pid=12345,fd=3))
청취가 없으면 socket_bind () 또는 socket_listen ()가 실패합니다.
청취가 정상이지만 연결이없는 경우 클라이언트가 연결을 시작하지 않았거나 방화벽에 의해 차단 될 수 있습니다.
상태가 close_wait 또는 time_wait 인 경우 연결 수명주기가 비정상적으로 끝나는 것을 의미합니다.
오류 메시지 <br>를 확인하십시오 각 소켓이 호출되면 Socket_strerr (socket_last_error ())를 사용하여 특정 오류 정보를보십시오.
방화벽 또는 Selinux 제한 <br> 8080 포트가 차단되지 않았 음을 확인하기 위해 iptables 또는 방화구를 사용하십시오.
항구는 다른 프로그램에 의해 점유됩니다 <br> LSOF -I : 8080을 사용하여 다른 프로그램이 항구를 점유하는지 확인하십시오.