<span><span>Warning: stream_socket_server(): unable to bind to tcp://127.0.0.1:8080 (Reason: Address already in use) in ...
</span></span>
이 오류는 일반적으로 stream_socket_server를 사용하여 다른 프로그램이 차지한 포트 또는 주소에 바인딩하려고 할 때 발생합니다. 두 가지 해결책이 있습니다.
포트가 점유되어 있는지 확인하십시오 : Netstat -tuln (Linux) 또는 LSOF -I : 8080 명령을 사용하여 다른 응용 프로그램에서 포트가 점유되었는지 확인하십시오.
다른 포트 선택 : 포트가 점유 된 경우 사용되지 않은 포트를 선택하거나 해당 포트를 차지하는 서비스를 중지하십시오.
<span><span>Warning: stream_socket_server(): unable to create socket resource in ...
</span></span>
이 오류는 시스템 제한 또는 권한 문제와 관련이있을 수 있습니다. 일반적인 이유는 다음과 같습니다.
불충분 한 권한 : Linux 시스템에서는 루트 권한이 1024 미만의 포트에 바인딩되어야합니다. 솔루션은 더 높은 포트 번호를 사용하거나 관리자 권한이있는 스크립트를 실행하는 것입니다.
시스템 리소스 제한 : 시스템은 열릴 파일 설명자 수에 제한이있을 수 있습니다. Ulimit -N 명령을 통해 현재 한계를보고 Ulimit -n <번호> 를 통해 한계를 늘릴 수 있습니다.
<span><span>Warning: stream_socket_accept(): unable to accept connection in ...
</span></span>
서버 리소스를 성공적으로 작성했지만 여전히 연결을 수락 할 수없는 경우 다음과 같은 이유 일 수 있습니다.
네트워크 구성 문제 : 바인딩 된 주소와 포트가 올바르고 네트워크가 연결되어 있는지 확인하십시오. 지역 개발 환경 인 경우 포트를 차단하는 방화벽이 없는지 확인하십시오.
차단 문제 : 기본적으로 Stream_Socket_Server 는 차단 기능입니다. 연결이 나오지 않으면 기다릴 것입니다. 이 문제를 피하기 위해 비 블로킹 모드를 사용할 수 있습니다.
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"tcp://127.0.0.1:8080"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
</span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span></span>
이런 식으로 연결이 없어도 프로그램은 계속 실행할 수 있습니다.
<span><span>Warning: stream_socket_accept(): connection reset by peer in ...
</span></span>
이 오류는 일반적으로 클라이언트가 연결 직후에 연결을 닫거나 네트워크 고장이 발생할 때입니다. 다음과 같이 해결할 수 있습니다.
연결 종료 이벤트 캡처 : 클라이언트 연결을 처리 할 때 예외를 처리하고 연결이 닫힌 후 리소스가 해제되어야합니다.
<span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$client</span></span><span>) {
</span><span><span class="hljs-comment">// 처리 연결</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>); </span><span><span class="hljs-comment">// 연결을 닫으십시오</span></span><span>
}
</span></span>
클라이언트 안정성 확인 : 오류 또는 예기치 않은 이유로 인해 클라이언트가 연결을 닫는 지 확인하십시오. 네트워크 패킷 캡처 도구 (예 : Wireshark)를 통해 클라이언트와 서버 간의 네트워크 상호 작용을보고 네트워크 문제를 해결할 수 있습니다.
<span><span>Warning: stream_socket_recvfrom(): unable to read from socket resource in ...
</span></span>
이 오류는 일반적으로 클라이언트의 데이터를 읽으려고 할 때 발생합니다. 클라이언트가 데이터를 보내지 않거나 연결을 닫았 기 때문일 수 있습니다. 솔루션은 다음과 같습니다.
클라이언트 동작 확인 : 클라이언트가 데이터를 전송 한 후 클라이언트가 데이터를 전송하고 연결을 미리 닫지 않도록하십시오.
읽기 시간 초과 증가 : 클라이언트가 조만간 데이터를 보내겠다고 기대하면 읽기 시간 초과를 설정할 수 있습니다.
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// 10두 번째 시간 초과</span></span><span>
</span></span>
<span><span>Warning: stream_socket_server(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac in ...
</span></span>
stream_socket_server 에서 ssl을 활성화하면 ssl/tls 관련 오류가 발생할 수 있습니다. 일반적인 이유는 다음과 같습니다.
인증서 문제 : 올바른 SSL 인증서와 개인 키 파일을 제공하고 파일 경로가 올바른지 확인하십시오.
OpenSSL 구성 문제 : PHP 설치에 OpenSSL 확장 기능이 포함되어 있는지 확인하고 SSL 지원이 PHP 구성 파일 (php.ini)에서 활성화되어 있는지 확인하십시오.
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"ssl://127.0.0.1:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'ssl'</span></span><span> => [
</span><span><span class="hljs-string">'local_cert'</span></span><span> => </span><span><span class="hljs-string">'/path/to/cert.pem'</span></span><span>,
</span><span><span class="hljs-string">'local_pk'</span></span><span> => </span><span><span class="hljs-string">'/path/to/private.key'</span></span><span>,
</span><span><span class="hljs-string">'verify_peer'</span></span><span> => </span><span><span class="hljs-literal">false</span></span><span>,
]
]));
</span></span>
또한 OpenSSL 버전의 PHP를 확인하여 필요한 암호화 프로토콜을 지원하는지 확인할 수도 있습니다.