비동기, 스트리밍 일반 텍스트 TCP/IP, 보안 TLS 소켓 서버 및 ReactPHP용 클라이언트 연결.
개발 버전: 이 분기에는 향후 v3 릴리스에 대한 코드가 포함되어 있습니다. 현재 stable v1 릴리스의 코드는
1.x
분기를 확인하세요.다가오는 v3 릴리스는 이 패키지의 발전이 될 것입니다. 하지만 아직 최신 버전이 아닌 버전에 대해서는 v1을 적극적으로 지원할 예정입니다. 자세한 내용은 설치 지침을 참조하세요.
소켓 라이브러리는 EventLoop
및 Stream
구성 요소를 기반으로 하는 소켓 계층 서버 및 클라이언트에 재사용 가능한 인터페이스를 제공합니다. 서버 구성 요소를 사용하면 네트워킹 클라이언트(예: HTTP 서버)에서 들어오는 연결을 수락하는 네트워킹 서버를 구축할 수 있습니다. 클라이언트 구성 요소를 사용하면 네트워킹 서버(예: HTTP 또는 데이터베이스 클라이언트)로 나가는 연결을 설정하는 네트워킹 클라이언트를 구축할 수 있습니다. 이 라이브러리는 이 모든 것에 대한 비동기 스트리밍 수단을 제공하므로 차단 없이 여러 동시 연결을 처리할 수 있습니다.
목차
다음은 무엇이든 보내면 연결을 닫는 서버입니다.
$ socket = new React Socket SocketServer ( ' 127.0.0.1:8080 ' );
$ socket -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( " Hello " . $ connection -> getRemoteAddress () . " ! n" );
$ connection -> write ( " Welcome to this amazing server! n" );
$ connection -> write ( " Here's a tip: don't say anything. n" );
$ connection -> on ( ' data ' , function ( $ data ) use ( $ connection ) {
$ connection -> close ();
});
});
예제도 참조하세요.
다음은 해당 서버의 출력을 출력한 다음 문자열을 보내려고 시도하는 클라이언트입니다.
$ connector = new React Socket Connector ();
$ connector -> connect ( ' 127.0.0.1:8080 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> pipe ( new React Stream WritableResourceStream ( STDOUT ));
$ connection -> write ( " Hello World! n" );
}, function ( Exception $ e ) {
echo ' Error: ' . $ e -> getMessage () . PHP_EOL ;
});
ConnectionInterface
는 일반 TCP/IP 연결과 같은 들어오고 나가는 연결을 나타내는 데 사용됩니다.
들어오거나 나가는 연결은 React의 DuplexStreamInterface
구현하는 이중 스트림(읽기 및 쓰기 가능)입니다. 여기에는 이 연결이 설정된 로컬 및 원격 주소(클라이언트 IP)에 대한 추가 속성이 포함되어 있습니다.
가장 일반적으로 이 ConnectionInterface
구현하는 인스턴스는 ServerInterface
구현하는 모든 클래스에서 내보내지고 ConnectorInterface
구현하는 모든 클래스에서 사용됩니다.
ConnectionInterface
기본 DuplexStreamInterface
구현하므로 해당 이벤트와 메서드를 평소와 같이 사용할 수 있습니다.
$ connection -> on ( ' data ' , function ( $ chunk ) {
echo $ chunk ;
});
$ connection -> on ( ' end ' , function () {
echo ' ended ' ;
});
$ connection -> on ( ' error ' , function ( Exception $ e ) {
echo ' error: ' . $ e -> getMessage ();
});
$ connection -> on ( ' close ' , function () {
echo ' closed ' ;
});
$ connection -> write ( $ data );
$ connection -> end ( $ data = null );
$ connection -> close ();
// …
자세한 내용은 DuplexStreamInterface
를 참조하세요.
getRemoteAddress(): ?string
메소드는 이 연결이 설정된 전체 원격 주소(URI)를 반환합니다.
$ address = $ connection -> getRemoteAddress ();
echo ' Connection with ' . $ address . PHP_EOL ;
원격 주소를 확인할 수 없거나 현재 알 수 없는 경우(예: 연결이 닫힌 후) 대신 NULL
값을 반환할 수 있습니다.
그렇지 않으면 전체 주소(URI)를 tcp://127.0.0.1:8080
, tcp://[::1]:80
, tls://127.0.0.1:443
과 같은 문자열 값으로 반환합니다. unix://example.sock
또는 unix:///path/to/example.sock
. 개별 URI 구성 요소는 애플리케이션별로 다르며 기본 전송 프로토콜에 따라 달라집니다.
TCP/IP 기반 연결이고 원격 IP만 원하는 경우 다음과 같이 사용할 수 있습니다.
$ address = $ connection -> getRemoteAddress ();
$ ip = trim ( parse_url ( $ address , PHP_URL_HOST ), ' [] ' );
echo ' Connection with ' . $ ip . PHP_EOL ;
getLocalAddress(): ?string
메소드는 이 연결이 설정된 전체 로컬 주소(URI)를 반환합니다.
$ address = $ connection -> getLocalAddress ();
echo ' Connection with ' . $ address . PHP_EOL ;
로컬 주소를 결정할 수 없거나 현재 알 수 없는 경우(예: 연결이 닫힌 후) 대신 NULL
값을 반환할 수 있습니다.
그렇지 않으면 전체 주소(URI)를 tcp://127.0.0.1:8080
, tcp://[::1]:80
, tls://127.0.0.1:443
과 같은 문자열 값으로 반환합니다. unix://example.sock
또는 unix:///path/to/example.sock
. 개별 URI 구성 요소는 애플리케이션별로 다르며 기본 전송 프로토콜에 따라 달라집니다.
이 메서드는 getRemoteAddress()
메서드를 보완하므로 혼동해서는 안 됩니다.
TcpServer
인스턴스가 여러 인터페이스(예: 주소 0.0.0.0
사용)를 수신하는 경우 이 메서드를 사용하여 실제로 이 연결을 수락한 인터페이스(예: 공용 또는 로컬 인터페이스)를 확인할 수 있습니다.
시스템에 여러 인터페이스(예: WAN 및 LAN 인터페이스)가 있는 경우 이 방법을 사용하여 이 연결에 실제로 어떤 인터페이스가 사용되었는지 확인할 수 있습니다.
ServerInterface
는 일반 TCP/IP 연결과 같은 들어오는 스트리밍 연결을 수락하기 위한 인터페이스를 제공합니다.
대부분의 상위 수준 구성 요소(예: HTTP 서버)는 들어오는 스트리밍 연결을 허용하기 위해 이 인터페이스를 구현하는 인스턴스를 허용합니다. 이는 일반적으로 종속성 주입을 통해 수행되므로 이 인터페이스의 다른 구현과 실제로 이 구현을 바꾸는 것은 매우 간단합니다. 이는 이 인터페이스의 구체적인 구현 대신 이 인터페이스에 대해 유형 힌트를 입력해야 함을 의미합니다.
몇 가지 메소드를 정의하는 것 외에도 이 인터페이스는 특정 이벤트에 반응할 수 있는 EventEmitterInterface
도 구현합니다.
새 연결이 설정될 때마다 connection
이벤트가 발생합니다. 즉, 새 클라이언트가 이 서버 소켓에 연결됩니다.
$ socket -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
echo ' new connection ' . PHP_EOL ;
});
들어오는 연결 처리에 대한 자세한 내용은 ConnectionInterface
참조하세요.
클라이언트로부터 새 연결을 수락하는 중에 오류가 발생할 때마다 error
이벤트가 발생합니다.
$ socket -> on ( ' error ' , function ( Exception $ e ) {
echo ' error: ' . $ e -> getMessage () . PHP_EOL ;
});
이는 치명적인 오류 이벤트가 아니라는 점에 유의하십시오. 즉, 이 이벤트 이후에도 서버는 계속해서 새 연결을 수신합니다.
getAddress(): ?string
메소드는 이 서버가 현재 수신 대기 중인 전체 주소(URI)를 반환하는 데 사용할 수 있습니다.
$ address = $ socket -> getAddress ();
echo ' Server listening on ' . $ address . PHP_EOL ;
주소를 결정할 수 없거나 현재 알 수 없는 경우(예: 소켓이 닫힌 후) 대신 NULL
값을 반환할 수 있습니다.
그렇지 않으면 전체 주소(URI)를 문자열 값(예: tcp://127.0.0.1:8080
, tcp://[::1]:80
, tls://127.0.0.1:443
unix://example.sock
으로 반환합니다. unix://example.sock
또는 unix:///path/to/example.sock
. 개별 URI 구성 요소는 애플리케이션별로 다르며 기본 전송 프로토콜에 따라 달라집니다.
TCP/IP 기반 서버이고 로컬 포트만 원하는 경우 다음과 같이 사용할 수 있습니다.
$ address = $ socket -> getAddress ();
$ port = parse_url ( $ address , PHP_URL_PORT );
echo ' Server listening on port ' . $ port . PHP_EOL ;
pause(): void
메소드를 사용하면 새로 들어오는 연결 수락을 일시 중지할 수 있습니다.
EventLoop에서 소켓 리소스를 제거하여 새 연결 수락을 중지합니다. 청취 소켓은 활성 상태로 유지되고 닫히지 않습니다.
즉, 새로 들어오는 연결은 구성 가능한 백로그가 채워질 때까지 운영 체제 백로그에 보류 상태로 유지됩니다. 백로그가 채워지면 운영 체제는 새 연결 허용을 재개하여 백로그가 다시 소모될 때까지 추가로 들어오는 연결을 거부할 수 있습니다.
서버가 일시 중지되면 더 이상 connection
이벤트가 발생하지 않아야 합니다.
$ socket -> pause ();
$ socket -> on ( ' connection ' , assertShouldNeverCalled ());
이 방법은 권고사항일 뿐입니다. 일반적으로 권장되지는 않지만 서버는 계속해서 connection
이벤트를 생성할 수 있습니다.
달리 명시하지 않는 한, 성공적으로 열린 서버는 일시 중지된 상태에서 시작되어서는 안 됩니다.
resume()
다시 호출하여 이벤트 처리를 계속할 수 있습니다.
두 메서드 모두 여러 번 호출할 수 있으며, 특히 pause()
두 번 이상 호출하면 아무런 효과가 있어서는 안 됩니다. 마찬가지로, close()
이후에 이것을 호출하는 것은 NO-OP입니다.
resume(): void
메소드를 사용하여 새로 들어오는 연결 수락을 재개할 수 있습니다.
이전 pause()
이후 EventLoop에 소켓 리소스를 다시 연결합니다.
$ socket -> pause ();
Loop:: addTimer ( 1.0 , function () use ( $ socket ) {
$ socket -> resume ();
});
두 메서드 모두 여러 번 호출할 수 있습니다. 특히 이전에 일시 pause()
없이 resume()
호출하면 아무런 효과가 있어서는 안 됩니다. 마찬가지로, close()
이후에 이것을 호출하는 것은 NO-OP입니다.
close(): void
메소드를 사용하여 이 청취 소켓을 종료할 수 있습니다.
그러면 이 소켓에서 새로 들어오는 연결 수신이 중지됩니다.
echo ' Shutting down server socket ' . PHP_EOL ;
$ socket -> close ();
동일한 인스턴스에서 이 메서드를 두 번 이상 호출하는 것은 NO-OP입니다.
SocketServer
클래스는 ServerInterface
구현하고 일반 텍스트 TCP/IP 또는 보안 TLS 연결 스트림과 같은 들어오는 스트리밍 연결을 허용하는 이 패키지의 기본 클래스입니다.
일반 텍스트 TCP/IP 연결을 허용하려면 다음과 같이 호스트와 포트 조합을 전달하면 됩니다.
$ socket = new React Socket SocketServer ( ' 127.0.0.1:8080 ' );
로컬 호스트 주소 127.0.0.1
을 수신한다는 것은 이 시스템 외부에서 연결할 수 없음을 의미합니다. 소켓이 수신 대기 중인 호스트를 변경하려면 인터페이스의 IP 주소를 제공하거나 특수 0.0.0.0
주소를 사용하여 모든 인터페이스에서 수신 대기할 수 있습니다.
$ socket = new React Socket SocketServer ( ' 0.0.0.0:8080 ' );
IPv6 주소를 수신하려면 호스트를 대괄호로 묶어야 합니다.
$ socket = new React Socket SocketServer ( ' [::1]:8080 ' );
무작위 포트 할당을 사용하려면 포트 0
을 사용할 수 있습니다.
$ socket = new React Socket SocketServer ( ' 127.0.0.1:0 ' );
$ address = $ socket -> getAddress ();
Unix 도메인 소켓(UDS) 경로를 수신하려면 URI 앞에 unix://
구성표를 붙여야 합니다.
$ socket = new React Socket SocketServer ( ' unix:///tmp/server.sock ' );
기존 파일 설명자(FD) 번호를 수신하려면 다음과 같이 URI 앞에 php://fd/
붙여야 합니다.
$ socket = new React Socket SocketServer ( ' php://fd/3 ' );
주어진 URI가 유효하지 않거나, 포트나 다른 체계를 포함하지 않거나, 호스트 이름을 포함하는 경우 InvalidArgumentException
이 발생합니다.
// throws InvalidArgumentException due to missing port
$ socket = new React Socket SocketServer ( ' 127.0.0.1 ' );
주어진 URI가 유효한 것처럼 보이지만 수신이 실패하는 경우(예: 포트가 이미 사용 중이거나 1024 미만의 포트에 루트 액세스가 필요할 수 있는 경우 등) RuntimeException
발생합니다.
$ first = new React Socket SocketServer ( ' 127.0.0.1:8080 ' );
// throws RuntimeException because port is already in use
$ second = new React Socket SocketServer ( ' 127.0.0.1:8080 ' );
이러한 오류 조건은 시스템 및/또는 구성에 따라 다를 수 있습니다. 실제 오류 조건에 대한 자세한 내용은 예외 메시지 및 코드를 참조하세요.
선택적으로 다음과 같이 기본 스트림 소켓 리소스에 대한 TCP 소켓 컨텍스트 옵션을 지정할 수 있습니다.
$ socket = new React Socket SocketServer ( ' [::1]:8080 ' , [
' tcp ' => [
' backlog ' => 200 ,
' so_reuseport ' => true ,
' ipv6_v6only ' => true
]
]);
사용 가능한 소켓 컨텍스트 옵션, 기본값 및 변경 효과는 시스템 및/또는 PHP 버전에 따라 다를 수 있습니다. 알 수 없는 컨텍스트 옵션을 전달해도 아무런 효과가 없습니다. 명시적으로 지정하지 않는 한
backlog
컨텍스트 옵션의 기본값은511
입니다.
tls://
URI 체계를 앞에 추가하면 보안 TLS(이전의 SSL) 서버를 시작할 수 있습니다. 내부적으로는 일반 텍스트 TCP/IP 연결을 기다린 다음 각 연결에 대해 TLS 핸드셰이크를 수행합니다. 따라서 PEM으로 인코딩된 인증서 파일을 사용하는 경우 가장 기본적인 형태로 다음과 같은 유효한 TLS 컨텍스트 옵션이 필요합니다.
$ socket = new React Socket SocketServer ( ' tls://127.0.0.1:8080 ' , [
' tls ' => [
' local_cert ' => ' server.pem '
]
]);
인증서 파일은 인스턴스화 시 로드되지 않고 들어오는 연결이 TLS 컨텍스트를 초기화할 때 로드됩니다. 이는 유효하지 않은 인증서 파일 경로나 내용이 나중에
error
이벤트만 발생시킨다는 것을 의미합니다.
개인 키가 암호로 암호화된 경우 다음과 같이 지정해야 합니다.
$ socket = new React Socket SocketServer ( ' tls://127.0.0.1:8000 ' , [
' tls ' => [
' local_cert ' => ' server.pem ' ,
' passphrase ' => ' secret '
]
]);
기본적으로 이 서버는 TLSv1.0+를 지원하며 레거시 SSLv2/SSLv3에 대한 지원은 제외합니다. 원격 측과 협상하려는 TLS 버전을 명시적으로 선택할 수도 있습니다.
$ socket = new React Socket SocketServer ( ' tls://127.0.0.1:8000 ' , [
' tls ' => [
' local_cert ' => ' server.pem ' ,
' crypto_method ' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER
]
]);
사용 가능한 TLS 컨텍스트 옵션, 기본값 및 변경 효과는 시스템 및/또는 PHP 버전에 따라 다를 수 있습니다. 외부 컨텍스트 배열을 사용하면
tcp
(및 더 많은) 컨텍스트 옵션을 동시에 사용할 수도 있습니다. 알 수 없는 컨텍스트 옵션을 전달해도 아무런 효과가 없습니다.tls://
구성표를 사용하지 않는 경우tls
컨텍스트 옵션을 전달해도 효과가 없습니다.
클라이언트가 연결될 때마다 ConnectionInterface
구현하는 연결 인스턴스와 함께 connection
이벤트를 내보냅니다.
$ socket -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
echo ' Plaintext connection from ' . $ connection -> getRemoteAddress () . PHP_EOL ;
$ connection -> write ( ' hello there! ' . PHP_EOL );
…
});
자세한 내용은 ServerInterface
참조하세요.
이 클래스는 이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있는 선택적 LoopInterface|null $loop
매개변수를 사용합니다. 기본 루프를 사용하려면 여기서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시적으로 사용하려는 것이 확실하지 않은 한 이 값을 제공해서는 안 됩니다.
SocketServer
클래스는 TCP/IP 소켓에 대한 구체적인 구현입니다. 상위 수준 프로토콜 구현에서 힌트를 입력하려면 일반ServerInterface
대신 사용해야 합니다.
TcpServer
클래스는 ServerInterface
구현하고 일반 텍스트 TCP/IP 연결을 허용합니다.
$ server = new React Socket TcpServer ( 8080 );
위와 같이 $uri
매개변수는 포트로만 구성될 수 있으며, 이 경우 서버는 기본적으로 로컬 호스트 주소 127.0.0.1
에서 수신 대기하게 되며, 이는 이 시스템 외부에서 연결할 수 없음을 의미합니다.
무작위 포트 할당을 사용하려면 포트 0
을 사용할 수 있습니다.
$ server = new React Socket TcpServer ( 0 );
$ address = $ server -> getAddress ();
소켓이 수신 대기 중인 호스트를 변경하려면 생성자에 제공된 첫 번째 매개변수를 통해 IP 주소를 제공할 수 있습니다. 선택적으로 tcp://
체계가 앞에옵니다.
$ server = new React Socket TcpServer ( ' 192.168.0.1:8080 ' );
IPv6 주소를 수신하려면 호스트를 대괄호로 묶어야 합니다.
$ server = new React Socket TcpServer ( ' [::1]:8080 ' );
주어진 URI가 유효하지 않거나, 포트나 다른 체계를 포함하지 않거나, 호스트 이름을 포함하는 경우 InvalidArgumentException
이 발생합니다.
// throws InvalidArgumentException due to missing port
$ server = new React Socket TcpServer ( ' 127.0.0.1 ' );
주어진 URI가 유효한 것처럼 보이지만 수신이 실패하는 경우(예: 포트가 이미 사용 중이거나 1024 미만의 포트에 루트 액세스가 필요할 수 있는 경우 등) RuntimeException
발생합니다.
$ first = new React Socket TcpServer ( 8080 );
// throws RuntimeException because port is already in use
$ second = new React Socket TcpServer ( 8080 );
이러한 오류 조건은 시스템 및/또는 구성에 따라 다를 수 있습니다. 실제 오류 조건에 대한 자세한 내용은 예외 메시지 및 코드를 참조하세요.
이 클래스는 이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있는 선택적 LoopInterface|null $loop
매개변수를 사용합니다. 기본 루프를 사용하려면 여기서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시적으로 사용하려는 것이 확실하지 않은 한 이 값을 제공해서는 안 됩니다.
선택적으로 다음과 같이 기본 스트림 소켓 리소스에 대한 소켓 컨텍스트 옵션을 지정할 수 있습니다.
$ server = new React Socket TcpServer ( ' [::1]:8080 ' , null , [
' backlog ' => 200 ,
' so_reuseport ' => true ,
' ipv6_v6only ' => true
]);
사용 가능한 소켓 컨텍스트 옵션, 기본값 및 변경 효과는 시스템 및/또는 PHP 버전에 따라 다를 수 있습니다. 알 수 없는 컨텍스트 옵션을 전달해도 아무런 효과가 없습니다. 명시적으로 지정하지 않는 한
backlog
컨텍스트 옵션의 기본값은511
입니다.
클라이언트가 연결될 때마다 ConnectionInterface
구현하는 연결 인스턴스와 함께 connection
이벤트를 내보냅니다.
$ server -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
echo ' Plaintext connection from ' . $ connection -> getRemoteAddress () . PHP_EOL ;
$ connection -> write ( ' hello there! ' . PHP_EOL );
…
});
자세한 내용은 ServerInterface
참조하세요.
SecureServer
클래스는 ServerInterface
구현하고 보안 TLS(이전의 SSL) 서버 제공을 담당합니다.
일반 텍스트 TCP/IP 연결을 기다린 다음 각 연결에 대해 TLS 핸드셰이크를 수행하는 TcpServer
인스턴스를 래핑하여 이를 수행합니다. 따라서 PEM으로 인코딩된 인증서 파일을 사용하는 경우 가장 기본적인 형태로 다음과 같은 유효한 TLS 컨텍스트 옵션이 필요합니다.
$ server = new React Socket TcpServer ( 8000 );
$ server = new React Socket SecureServer ( $ server , null , [
' local_cert ' => ' server.pem '
]);
인증서 파일은 인스턴스화 시 로드되지 않지만 들어오는 연결이 TLS 컨텍스트를 초기화할 때 로드됩니다. 이는 유효하지 않은 인증서 파일 경로나 내용이 나중에
error
이벤트만 발생시킨다는 것을 의미합니다.
개인 키가 암호로 암호화된 경우 다음과 같이 지정해야 합니다.
$ server = new React Socket TcpServer ( 8000 );
$ server = new React Socket SecureServer ( $ server , null , [
' local_cert ' => ' server.pem ' ,
' passphrase ' => ' secret '
]);
기본적으로 이 서버는 TLSv1.0+를 지원하며 레거시 SSLv2/SSLv3에 대한 지원은 제외합니다. 원격 측과 협상하려는 TLS 버전을 명시적으로 선택할 수도 있습니다.
$ server = new React Socket TcpServer ( 8000 );
$ server = new React Socket SecureServer ( $ server , null , [
' local_cert ' => ' server.pem ' ,
' crypto_method ' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER
]);
사용 가능한 TLS 컨텍스트 옵션, 기본값 및 변경 효과는 시스템 및/또는 PHP 버전에 따라 다를 수 있습니다. 알 수 없는 컨텍스트 옵션을 전달해도 아무런 효과가 없습니다.
클라이언트가 TLS 핸드셰이크를 완료할 때마다 ConnectionInterface
구현하는 연결 인스턴스를 사용하여 connection
이벤트를 내보냅니다.
$ server -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
echo ' Secure connection from ' . $ connection -> getRemoteAddress () . PHP_EOL ;
$ connection -> write ( ' hello there! ' . PHP_EOL );
…
});
클라이언트가 성공적인 TLS 핸드셰이크 수행에 실패할 때마다 error
이벤트를 발생시키고 기본 TCP/IP 연결을 닫습니다.
$ server -> on ( ' error ' , function ( Exception $ e ) {
echo ' Error ' . $ e -> getMessage () . PHP_EOL ;
});
자세한 내용은 ServerInterface
참조하세요.
SecureServer
클래스는 TLS 소켓에 대한 구체적인 구현입니다. 상위 수준 프로토콜 구현에서 힌트를 입력하려면 일반 ServerInterface
대신 사용해야 합니다.
이 클래스는 이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있는 선택적 LoopInterface|null $loop
매개변수를 사용합니다. 기본 루프를 사용하려면 여기서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시적으로 사용하려는 것이 확실하지 않은 한 이 값을 제공해서는 안 됩니다.
고급 사용법:
ServerInterface
첫 번째 매개변수로 허용함에도 불구하고 수행 중인 작업을 알지 못하는 한TcpServer
인스턴스를 첫 번째 매개변수로 전달해야 합니다. 내부적으로SecureServer
기본 스트림 리소스에 필요한 TLS 컨텍스트 옵션을 설정해야 합니다. 이러한 리소스는 이 패키지에 정의된 인터페이스를 통해 노출되지 않고 내부Connection
클래스를 통해서만 노출됩니다.TcpServer
클래스는ConnectionInterface
구현하는 연결을 생성하고 이러한 기본 리소스를 노출하기 위해 내부Connection
클래스를 사용하도록 보장됩니다. 사용자 정의ServerInterface
사용하고 해당connection
이벤트가 이 요구 사항을 충족하지 않는 경우SecureServer
error
이벤트를 내보낸 다음 기본 연결을 닫습니다.
UnixServer
클래스는 ServerInterface
구현하고 Unix 도메인 소켓(UDS)에서 연결을 수락하는 역할을 담당합니다.
$ server = new React Socket UnixServer ( ' /tmp/server.sock ' );
위와 같이 $uri
매개변수는 소켓 경로 또는 unix://
체계가 앞에 붙은 소켓 경로로만 구성될 수 있습니다.
주어진 URI가 유효한 것처럼 보이지만 이를 수신하는 데 실패하는 경우(예: 소켓이 이미 사용 중이거나 파일에 액세스할 수 없는 경우 등) RuntimeException
이 발생합니다.
$ first = new React Socket UnixServer ( ' /tmp/same.sock ' );
// throws RuntimeException because socket is already in use
$ second = new React Socket UnixServer ( ' /tmp/same.sock ' );
이러한 오류 조건은 시스템 및/또는 구성에 따라 다를 수 있습니다. 특히 Zend PHP는 UDS 경로가 이미 존재하고 바인딩될 수 없는 경우에만 "알 수 없는 오류"를 보고합니다. 이 경우 보다 사용자에게 친숙한 오류 메시지를 보고하려면 지정된 UDS 경로에서
is_file()
확인하는 것이 좋습니다. 실제 오류 조건에 대한 자세한 내용은 예외 메시지 및 코드를 참조하세요.
이 클래스는 이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있는 선택적 LoopInterface|null $loop
매개변수를 사용합니다. 기본 루프를 사용하려면 여기서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시적으로 사용하려는 것이 확실하지 않은 한 이 값을 제공해서는 안 됩니다.
클라이언트가 연결될 때마다 ConnectionInterface
구현하는 연결 인스턴스와 함께 connection
이벤트를 내보냅니다.
$ server -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
echo ' New connection ' . PHP_EOL ;
$ connection -> write ( ' hello there! ' . PHP_EOL );
…
});
자세한 내용은 ServerInterface
참조하세요.
LimitingServer
데코레이터는 지정된 ServerInterface
래핑하고 이 서버 인스턴스에 대한 열려 있는 연결을 제한하고 추적하는 일을 담당합니다.
기본 서버가 connection
이벤트를 내보낼 때마다 제한을 확인하고 다음 중 하나를 수행합니다.
connection
이벤트를 전달하여 이 연결을 추적합니다.error
이벤트를 전달합니다.연결이 닫힐 때마다 열린 연결 목록에서 이 연결이 제거됩니다.
$ server = new React Socket LimitingServer ( $ server , 100 );
$ server -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' hello there! ' . PHP_EOL );
…
});
자세한 내용은 두 번째 예를 참조하세요.
이 제한을 초과하면 서버가 자동으로 연결을 거부(닫기)하도록 하려면 최대 열린 연결 수를 전달해야 합니다. 이 경우 이를 알리기 위해 error
이벤트가 발생하며 connection
이벤트는 발생하지 않습니다.
$ server = new React Socket LimitingServer ( $ server , 100 );
$ server -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' hello there! ' . PHP_EOL );
…
});
열린 연결 수에 제한을 두지 않고 운영 체제 리소스(예: 열린 파일 핸들)가 부족해질 때까지 새 연결을 계속 허용하려면 null
제한을 전달할 수 있습니다. 이는 제한 적용을 처리하고 싶지 않지만 여전히 getConnections()
메서드를 사용하려는 경우 유용할 수 있습니다.
연결 제한에 도달하면 새 연결 수락을 일시 중지하도록 서버를 선택적으로 구성할 수 있습니다. 이 경우 기본 서버를 일시 중지하고 더 이상 새로운 연결을 전혀 처리하지 않으므로 더 이상 과도한 연결을 닫지 않습니다. 기본 운영 체제는 한도에 도달할 때까지 보류 중인 연결의 백로그를 유지하는 역할을 하며, 한도에 도달하면 추가 연결을 거부하기 시작합니다. 서버가 연결 제한 미만이면 백로그의 연결을 계속 사용하고 각 연결에서 미해결 데이터를 처리합니다. 이 모드는 응답 메시지(예: HTTP)를 기다리도록 설계된 일부 프로토콜에 유용할 수 있지만 즉각적인 응답(예: 대화형 채팅의 "환영" 메시지)을 요구하는 다른 프로토콜에는 덜 유용할 수 있습니다.
$ server = new React Socket LimitingServer ( $ server , 100 , true );
$ server -> on ( ' connection ' , function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' hello there! ' . PHP_EOL );
…
});
getConnections(): ConnectionInterface[]
메소드를 사용하면 현재 활성화된 모든 연결이 포함된 배열을 반환할 수 있습니다.
foreach ( $ server -> getConnection () as $ connection ) {
$ connection -> write ( ' Hi! ' );
}
ConnectorInterface
는 일반 TCP/IP 연결과 같은 스트리밍 연결을 설정하기 위한 인터페이스를 제공합니다.
이는 이 패키지에 정의된 기본 인터페이스이며 React의 광범위한 생태계 전반에 걸쳐 사용됩니다.
대부분의 상위 수준 구성 요소(예: HTTP, 데이터베이스 또는 기타 네트워킹 서비스 클라이언트)는 이 인터페이스를 구현하는 인스턴스를 수락하여 기본 네트워킹 서비스에 대한 TCP/IP 연결을 생성합니다. 이는 일반적으로 종속성 주입을 통해 수행되므로 이 인터페이스의 다른 구현과 실제로 이 구현을 바꾸는 것은 매우 간단합니다.
인터페이스는 단일 메서드만 제공합니다.
connect(string $uri): PromiseInterface<ConnectionInterface>
메서드를 사용하여 지정된 원격 주소에 대한 스트리밍 연결을 생성할 수 있습니다.
성공 시 ConnectionInterface
구현하는 스트림으로 이행하거나 연결이 성공하지 못한 경우 Exception
로 거부하는 Promise를 반환합니다.
$ connector -> connect ( ' google.com:443 ' )-> then (
function ( React Socket ConnectionInterface $ connection ) {
// connection successfully established
},
function ( Exception $ error ) {
// failed to connect due to $error
}
);
자세한 내용은 ConnectionInterface
참조하세요.
반환된 Promise는 아직 보류 중일 때 취소될 수 있는 방식으로 구현되어야 합니다. 보류 중인 약속을 취소하려면 Exception
으로 해당 값을 거부해야 합니다. 해당하는 경우 기본 리소스와 참조를 모두 정리해야 합니다.
$ promise = $ connector -> connect ( $ uri );
$ promise -> cancel ();
Connector
클래스는 ConnectorInterface
구현하고 스트리밍 연결을 생성할 수 있게 해주는 이 패키지의 기본 클래스입니다.
이 커넥터를 사용하여 일반 텍스트 TCP/IP, 보안 TLS 또는 로컬 Unix 연결 스트림과 같은 모든 종류의 스트리밍 연결을 생성할 수 있습니다.
이는 메인 이벤트 루프에 바인딩되며 다음과 같이 사용할 수 있습니다.
$ connector = new React Socket Connector ();
$ connector -> connect ( $ uri )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
}, function ( Exception $ e ) {
echo ' Error: ' . $ e -> getMessage () . PHP_EOL ;
});
일반 텍스트 TCP/IP 연결을 생성하려면 다음과 같이 호스트와 포트 조합을 전달하면 됩니다.
$ connector -> connect ( ' www.google.com:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
대상 URI에 URI 체계를 지정하지 않으면
tcp://
기본값으로 가정하고 일반 텍스트 TCP/IP 연결을 설정합니다. TCP/IP 연결에는 위와 같이 대상 URI에 호스트 및 포트 부분이 필요하며 다른 모든 URI 구성 요소는 선택 사항입니다.
보안 TLS 연결을 생성하려면 다음과 같이 tls://
URI 체계를 사용할 수 있습니다.
$ connector -> connect ( ' tls://www.google.com:443 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
로컬 Unix 도메인 소켓 연결을 생성하려면 다음과 같이 unix://
URI 체계를 사용할 수 있습니다.
$ connector -> connect ( ' unix:///tmp/demo.sock ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
getRemoteAddress()
메서드는unix://
체계(예:unix:///tmp/demo.sock
)를 포함하여connect()
메서드에 지정된 대상 Unix 도메인 소켓(UDS) 경로를 반환합니다.getLocalAddress()
메소드는 여기서 UDS 연결에 적용할 수 없는 값이므로null
값을 반환할 가능성이 높습니다.
내부적으로 Connector
이 패키지에 구현된 하위 수준 커넥터에 대한 상위 수준 외관 으로 구현됩니다. 즉, 모든 기능과 구현 세부 정보도 공유합니다. 상위 수준 프로토콜 구현에서 힌트를 입력하려면 대신 일반 ConnectorInterface
사용해야 합니다.
v1.4.0
부터 Connector
클래스는 기본적으로 호스트 이름이 제공되면 IPv4 또는 IPv6를 통해 자동으로 연결하기 위해 Happy Eyeballs 알고리즘을 사용합니다. 이는 IPv4와 IPv6를 동시에 사용하여 자동으로 연결을 시도하므로(IPv6 선호) 불완전한 IPv6 연결 또는 설정으로 인해 사용자가 직면하는 일반적인 문제를 피할 수 있습니다. IPv4 조회만 수행하고 단일 IPv4 연결만 시도하는 이전 동작으로 되돌리려면 다음과 같이 Connector
설정할 수 있습니다.
$ connector = new React Socket Connector ([
' happy_eyeballs ' => false
]);
마찬가지로 다음과 같이 기본 DNS 동작에 영향을 줄 수도 있습니다. Connector
클래스는 기본적으로 모든 공개 호스트 이름을 기본 IP 주소로 확인하기 위해 시스템 DNS 설정을 감지하고(시스템 설정을 확인할 수 없는 경우 대체 수단으로 Google의 공개 DNS 서버 8.8.8.8
사용함) 시도합니다. 사용자 지정 DNS 서버(예: 로컬 DNS 릴레이 또는 회사 전체 DNS 서버)를 명시적으로 사용하려는 경우 다음과 같이 Connector
설정할 수 있습니다.
$ connector = new React Socket Connector ([
' dns ' => ' 127.0.1.1 '
]);
$ connector -> connect ( ' localhost:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
DNS 확인자를 전혀 사용하지 않고 IP 주소에만 연결하려는 경우 다음과 같이 Connector
설정할 수도 있습니다.
$ connector = new React Socket Connector ([
' dns ' => false
]);
$ connector -> connect ( ' 127.0.0.1:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
고급: 사용자 지정 DNS ReactDnsResolverResolverInterface
인스턴스가 필요한 경우 다음과 같이 Connector
설정할 수도 있습니다.
$ dnsResolverFactory = new React Dns Resolver Factory ();
$ resolver = $ dnsResolverFactory -> createCached ( ' 127.0.1.1 ' );
$ connector = new React Socket Connector ([
' dns ' => $ resolver
]);
$ connector -> connect ( ' localhost:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
기본적으로 tcp://
및 tls://
URI 체계는 default_socket_timeout
ini 설정(기본값은 60초)을 따르는 시간 초과 값을 사용합니다. 사용자 지정 시간 초과 값을 원하는 경우 다음과 같이 간단히 전달할 수 있습니다.
$ connector = new React Socket Connector ([
' timeout ' => 10.0
]);
마찬가지로 시간 제한을 전혀 적용하지 않고 운영 체제에서 이를 처리하도록 하려면 다음과 같이 부울 플래그를 전달할 수 있습니다.
$ connector = new React Socket Connector ([
' timeout ' => false
]);
기본적으로 Connector
tcp://
, tls://
및 unix://
URI 체계를 지원합니다. 이들 중 하나라도 명시적으로 금지하려면 다음과 같이 부울 플래그를 전달하면 됩니다.
// only allow secure TLS connections
$ connector = new React Socket Connector ([
' tcp ' => false ,
' tls ' => true ,
' unix ' => false ,
));
$ connector -> connect ( ' tls://google.com:443 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
tcp://
및 tls://
기본 커넥터에 전달된 추가 컨텍스트 옵션도 허용합니다. 추가 컨텍스트 옵션을 명시적으로 전달하려면 다음과 같이 컨텍스트 옵션 배열을 전달하면 됩니다.
// allow insecure TLS connections
$ connector = new React Socket Connector ([
' tcp ' => [
' bindto ' => ' 192.168.0.1:0 '
],
' tls ' => [
' verify_peer ' => false ,
' verify_peer_name ' => false
],
]);
$ connector -> connect ( ' tls://localhost:443 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
기본적으로 이 커넥터는 TLSv1.0+를 지원하며 레거시 SSLv2/SSLv3에 대한 지원은 제외합니다. 원격 측과 협상하려는 TLS 버전을 명시적으로 선택할 수도 있습니다.
$ connector = new React Socket Connector ([
' tls ' => [
' crypto_method ' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
]
]);
컨텍스트 옵션에 대한 자세한 내용은 소켓 컨텍스트 옵션 및 SSL 컨텍스트 옵션에 대한 PHP 설명서를 참조하세요.
고급: 기본적으로 Connector
tcp://
, tls://
및 unix://
URI 체계를 지원합니다. 이를 위해 필요한 커넥터 클래스를 자동으로 설정합니다. 이들 중 하나에 대해 사용자 정의 커넥터를 명시적으로 전달하려면 다음과 같이 ConnectorInterface
구현하는 인스턴스를 전달하면 됩니다.
$ dnsResolverFactory = new React Dns Resolver Factory ();
$ resolver = $ dnsResolverFactory -> createCached ( ' 127.0.1.1 ' );
$ tcp = new React Socket HappyEyeBallsConnector ( null , new React Socket TcpConnector (), $ resolver );
$ tls = new React Socket SecureConnector ( $ tcp );
$ unix = new React Socket UnixConnector ();
$ connector = new React Socket Connector ([
' tcp ' => $ tcp ,
' tls ' => $ tls ,
' unix ' => $ unix ,
' dns ' => false ,
' timeout ' => false ,
]);
$ connector -> connect ( ' google.com:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
내부적으로 위의 예와 같이 DNS를 비활성화하지 않는 한
tcp://
커넥터는 항상 DNS 확인자에 의해 래핑됩니다. 이 경우tcp://
커넥터는 확인된 IP 주소 대신 실제 호스트 이름을 수신하므로 조회 수행을 담당합니다. 내부적으로 자동으로 생성된tls://
커넥터는 보안 TLS 모드를 활성화하기 전에 기본 일반 텍스트 TCP/IP 연결을 설정하기 위해 항상 기본tcp://
커넥터를 래핑합니다. 보안 TLS 연결에만 사용자 정의 기본tcp://
커넥터를 사용하려는 경우 대신 위와 같이tls://
커넥터를 명시적으로 전달할 수 있습니다. 내부적으로tcp://
및tls://
커넥터는 위의 예와 같이 시간 제한을 비활성화하지 않는 한 항상TimeoutConnector
로 래핑됩니다.
이 클래스는 이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있는 선택적 LoopInterface|null $loop
매개변수를 사용합니다. 기본 루프를 사용하려면 여기서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시적으로 사용하려는 것이 확실하지 않은 한 이 값을 제공해서는 안 됩니다.
TcpConnector
클래스는 ConnectorInterface
구현하고 모든 IP 포트 조합에 대한 일반 텍스트 TCP/IP 연결을 생성할 수 있도록 해줍니다.
$ tcpConnector = new React Socket TcpConnector ();
$ tcpConnector -> connect ( ' 127.0.0.1:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
예제도 참조하세요.
보류 중인 연결 시도는 다음과 같이 보류 중인 약속을 취소하여 취소할 수 있습니다.
$ promise = $ tcpConnector -> connect ( ' 127.0.0.1:80 ' );
$ promise -> cancel ();
보류 중인 약속에 대해 cancel()
호출하면 기본 소켓 리소스가 닫히고 보류 중인 TCP/IP 연결이 취소되고 결과 약속이 거부됩니다.
이 클래스는 이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있는 선택적 LoopInterface|null $loop
매개변수를 사용합니다. 기본 루프를 사용하려면 여기서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시적으로 사용하려는 것이 확실하지 않은 한 이 값을 제공해서는 안 됩니다.
선택적으로 다음과 같이 추가 소켓 컨텍스트 옵션을 생성자에 전달할 수 있습니다.
$ tcpConnector = new React Socket TcpConnector ( null , [
' bindto ' => ' 192.168.0.1:0 '
]);
이 클래스를 사용하면 IP-포트 조합에만 연결할 수 있습니다. 주어진 URI가 유효하지 않거나 유효한 IP 주소 및 포트를 포함하지 않거나 다른 체계를 포함하는 경우 InvalidArgumentException
으로 거부됩니다.
주어진 URI가 유효한 것처럼 보이지만 연결이 실패하는 경우(예: 원격 호스트가 연결을 거부하는 경우 등) RuntimeException
으로 거부됩니다.
호스트 이름-포트 조합에 연결하려면 다음 장도 참조하세요.
고급 사용법: 내부적으로
TcpConnector
각 스트림 리소스에 대해 빈 컨텍스트 리소스를 할당합니다. 대상 URI에hostname
쿼리 매개변수가 포함되어 있는 경우 해당 값은 TLS 피어 이름을 설정하는 데 사용됩니다. 이는SecureConnector
및DnsConnector
에서 피어 이름을 확인하는 데 사용되며 사용자 지정 TLS 피어 이름을 원하는 경우에도 사용할 수 있습니다.
HappyEyeBallsConnector
클래스는 ConnectorInterface
구현하고 호스트 이름-포트-조합에 대한 일반 텍스트 TCP/IP 연결을 생성할 수 있게 해줍니다. 내부적으로 RFC6555
및 RFC8305
의 Happy Eyeballs 알고리즘을 구현하여 IPv6 및 IPv4 호스트 이름을 지원합니다.
먼저 DNS(해당되는 경우)를 통해 지정된 도메인 이름을 조회한 다음 확인된 대상 IP 주소에 대한 기본 TCP/IP 연결을 설정하도록 지정된 TcpConnector
인스턴스를 장식하여 이를 수행합니다.
다음과 같이 DNS 확인자와 기본 TCP 커넥터를 설정해야 합니다.
$ dnsResolverFactory = new React Dns Resolver Factory ();
$ dns = $ dnsResolverFactory -> createCached ( ' 8.8.8.8 ' );
$ dnsConnector = new React Socket HappyEyeBallsConnector ( null , $ tcpConnector , $ dns );
$ dnsConnector -> connect ( ' www.google.com:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
예제도 참조하세요.
보류 중인 연결 시도는 다음과 같이 보류 중인 약속을 취소하여 취소할 수 있습니다.
$ promise = $ dnsConnector -> connect ( ' www.google.com:80 ' );
$ promise -> cancel ();
보류 중인 Promise에 대해 cancel()
호출하면 기본 DNS 조회 및/또는 기본 TCP/IP 연결이 취소되고 결과 Promise가 거부됩니다.
이 클래스는 이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있는 선택적 LoopInterface|null $loop
매개변수를 사용합니다. 기본 루프를 사용하려면 여기서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시적으로 사용하려는 것이 확실하지 않은 한 이 값을 제공해서는 안 됩니다.
고급 사용법: 내부적으로
HappyEyeBallsConnector
는Resolver
사용하여 지정된 호스트 이름에 대한 IP 주소를 찾습니다. 그런 다음 대상 URI의 호스트 이름을 이 IP로 바꾸고hostname
쿼리 매개변수를 추가한 다음 이 업데이트된 URI를 기본 커넥터에 전달합니다. Happy Eye Balls 알고리즘은 지정된 호스트 이름에 대한 IPv6 및 IPv4 주소를 찾는 방법을 설명하므로 이 커넥터는 A 및 AAAA 레코드에 대한 두 개의 DNS 조회를 보냅니다. 그런 다음 모든 IP 주소(v6 및 v4 모두)를 사용하고 그 사이에 50ms 간격으로 모든 IP 주소에 연결을 시도합니다. IPv6과 IPv4 주소 간 전환. 연결이 설정되면 다른 모든 DNS 조회 및 연결 시도가 취소됩니다.
DnsConnector
클래스는 ConnectorInterface
구현하고 모든 호스트 이름-포트-조합에 대한 일반 텍스트 TCP/IP 연결을 생성할 수 있게 해줍니다.
먼저 DNS(해당되는 경우)를 통해 지정된 도메인 이름을 조회한 다음 확인된 대상 IP 주소에 대한 기본 TCP/IP 연결을 설정하도록 지정된 TcpConnector
인스턴스를 장식하여 이를 수행합니다.
다음과 같이 DNS 확인자와 기본 TCP 커넥터를 설정해야 합니다.
$ dnsResolverFactory = new React Dns Resolver Factory ();
$ dns = $ dnsResolverFactory -> createCached ( ' 8.8.8.8 ' );
$ dnsConnector = new React Socket DnsConnector ( $ tcpConnector , $ dns );
$ dnsConnector -> connect ( ' www.google.com:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( ' ... ' );
$ connection -> end ();
});
예제도 참조하세요.
보류 중인 연결 시도는 다음과 같이 보류 중인 약속을 취소하여 취소할 수 있습니다.
$ promise = $ dnsConnector -> connect ( ' www.google.com:80 ' );
$ promise -> cancel ();
보류 중인 Promise에 대해 cancel()
호출하면 기본 DNS 조회 및/또는 기본 TCP/IP 연결이 취소되고 결과 Promise가 거부됩니다.
고급 사용법: 내부적으로
DnsConnector
ReactDnsResolverResolverInterface
사용하여 지정된 호스트 이름에 대한 IP 주소를 찾습니다. 그런 다음 대상 URI의 호스트 이름을 이 IP로 바꾸고hostname
쿼리 매개변수를 추가한 다음 이 업데이트된 URI를 기본 커넥터에 전달합니다. 따라서 기본 커넥터는 대상 IP 주소에 대한 연결을 생성하는 역할을 담당하는 반면, 이 쿼리 매개변수는 원래 호스트 이름을 확인하는 데 사용될 수 있으며TcpConnector
에서 TLS 피어 이름을 설정하는 데 사용됩니다.hostname
이 명시적으로 제공되면 이 쿼리 매개변수는 수정되지 않으므로 사용자 정의 TLS 피어 이름을 원하는 경우 유용할 수 있습니다.
SecureConnector
클래스는 ConnectorInterface
구현하고 모든 호스트 이름-포트 조합에 대한 보안 TLS(이전의 SSL) 연결을 생성할 수 있도록 해줍니다.
먼저 일반 텍스트 TCP/IP 연결을 생성한 다음 이 스트림에서 TLS 암호화를 활성화하도록 지정된 DnsConnector
인스턴스를 장식하여 이를 수행합니다.
$ secureConnector = new React Socket SecureConnector ( $ dnsConnector );
$ secureConnector -> connect ( ' www.google.com:443 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( " GET / HTTP/1.0 rn Host: www.google.com rnrn" );
. . .
});
예제도 참조하세요.
보류중인 연결 시도는 다음과 같은 보류 약속을 취소하여 취소 할 수 있습니다.
$ promise = $ secureConnector -> connect ( ' www.google.com:443 ' );
$ promise -> cancel ();
보류 약속에서 cancel()
에게 전화하면 기본 TCP/IP 연결 및/또는 SSL/TLS 협상이 취소되고 결과 약속이 거부됩니다.
이 클래스는 옵션 LoopInterface|null $loop
매개 변수를 사용 하여이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있습니다. 기본 루프를 사용하려면 여기에서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시 적으로 사용하려는 경우이 값을 제공해서는 안됩니다.
선택적으로 추가 SSL 컨텍스트 옵션을 다음과 같이 생성자에게 전달할 수 있습니다.
$ secureConnector = new React Socket SecureConnector ( $ dnsConnector , null , [
' verify_peer ' => false ,
' verify_peer_name ' => false
]);
기본적 으로이 커넥터는 TLSV1.0+를 지원하고 레거시 SSLV2/SSLV3에 대한 지원을 제외합니다. 원격 측면과 협상하려는 TLS 버전을 명시 적으로 선택할 수도 있습니다.
$ secureConnector = new React Socket SecureConnector ( $ dnsConnector , null , [
' crypto_method ' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
]);
고급 사용 : 내부적으로
SecureConnector
기본 스트림 리소스에서 필요한 컨텍스트 옵션을 설정하는 데 의존합니다. 커넥터 스택의 어딘가에TcpConnector
와 함께 사용하여 각 스트림 리소스에 빈 컨텍스트 리소스를 할당하고 피어 이름을 확인할 수 있도록해야합니다. 그렇게하지 않으면 TLS 피어 이름 불일치 오류가 발생하거나 레이스 조건을 추적하기 어려울 수 있습니다. 모든 스트림 리소스는 하나의 공유 기본 컨텍스트 리소스를 사용하기 때문입니다.
TimeoutConnector
클래스는 ConnectorInterface
구현하고 기존 커넥터 인스턴스에 타임 아웃 처리를 추가 할 수 있습니다.
주어진 ConnectorInterface
인스턴스를 장식하고 너무 오래 걸리면 기본 연결 시도를 자동으로 거부하고 중단시키는 타이머를 시작함으로써 그렇게합니다.
$ timeoutConnector = new React Socket TimeoutConnector ( $ connector , 3.0 );
$ timeoutConnector -> connect ( ' google.com:80 ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
// connection succeeded within 3.0 seconds
});
예제도 참조하십시오.
이 클래스는 옵션 LoopInterface|null $loop
매개 변수를 사용 하여이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있습니다. 기본 루프를 사용하려면 여기에서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시 적으로 사용하려는 경우이 값을 제공해서는 안됩니다.
보류중인 연결 시도는 다음과 같은 보류 약속을 취소하여 취소 할 수 있습니다.
$ promise = $ timeoutConnector -> connect ( ' google.com:80 ' );
$ promise -> cancel ();
보류 약속에서 cancel()
호출하면 기본 연결 시도가 취소되고 타이머를 중단하며 결과 약속을 거부합니다.
UnixConnector
클래스는 ConnectorInterface
구현하고 UDS (Unix Domain Socket) 경로에 연결할 수 있습니다.
$ connector = new React Socket UnixConnector ();
$ connector -> connect ( ' /tmp/demo.sock ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( " HELLO n" );
});
Unix 도메인 소켓에 연결하는 것은 원자 연산입니다. 즉, 약속은 즉시 해결되거나 거부됩니다. 따라서 결과 약속에 대해 cancel()
호출하는 것은 영향을 미치지 않습니다.
getRemoteAddress()
메소드는connect()
메소드에 주어진 대상 대상 UNIX 도메인 소켓 (UDS) 경로를 반환하고unix://
scheme (예 :unix:///tmp/demo.sock
)으로 배정됩니다.getLocalAddress()
메소드는이 값이 UDS 연결에 적용되지 않으므로null
값을 반환 할 가능성이 높습니다.
이 클래스는 옵션 LoopInterface|null $loop
매개 변수를 사용 하여이 객체에 사용할 이벤트 루프 인스턴스를 전달하는 데 사용할 수 있습니다. 기본 루프를 사용하려면 여기에서 null
값을 사용할 수 있습니다. 주어진 이벤트 루프 인스턴스를 명시 적으로 사용하려는 경우이 값을 제공해서는 안됩니다.
FixedUriConnector
Class는 ConnectorInterface
구현하고 기존 커넥터를 장식하여 항상 고정 된 미리 구성된 URI를 사용합니다.
이것은 상위 레벨 API가 가정하는 기본 주소에 연결하는 대신 UNIX 도메인 소켓 (UDS) 경로에 명시 적으로 연결하려는 경우와 같이 특정 URI를 지원하지 않는 소비자에게 유용 할 수 있습니다.
$ connector = new React Socket FixedUriConnector (
' unix:///var/run/docker.sock ' ,
new React Socket UnixConnector ()
);
// destination will be ignored, actually connects to Unix domain socket
$ promise = $ connector -> connect ( ' localhost:80 ' );
이 라이브러리를 설치하는 권장 방법은 Composer를 사용하는 것입니다. Composer를 처음 사용하시나요?
일단 출시되면 이 프로젝트는 SemVer를 따릅니다. 현재로서는 최신 개발 버전이 설치됩니다.
composer require react/socket:^3@dev
버전 업그레이드에 대한 자세한 내용은 CHANGELOG를 참조하세요.
이 프로젝트는 모든 플랫폼에서 실행되는 것을 목표로 하므로 PHP 확장이 필요하지 않으며 PHP 7.1부터 현재 PHP 8+까지의 실행을 지원합니다. 이 프로젝트에는 지원되는 최신 PHP 버전을 사용하는 것이 좋습니다 .
레거시 PHP <7.3.3 (및 PHP <7.2.15)은 단편화 된 TLS 레코드에서 100% CPU 사용으로 Feof ()가 차단할 수있는 버그로 고통 받고 있습니다. 우리는 TLS 버퍼의 오래된 데이터를 피하기 위해 항상 완전한 수신 버퍼를 한 번에 소비하여이 문제를 해결하려고 노력합니다. 이것은 웰빙 동료를위한 높은 CPU 사용법을 해결하는 것으로 알려져 있지만, 이는 높은 처리량 시나리오에 매우 큰 데이터 청크를 유발할 수 있습니다. 영향을받는 버전의 네트워크 I/O 버퍼 또는 악의적 인 피어로 인해 버기 동작이 여전히 트리거 될 수 있습니다. 업그레이드가 권장됩니다.
레거시 PHP <7.1.4는 한 번에 TLS 스트림에 대한 큰 데이터 덩어리를 작성할 때 버그가 발생합니다. 우리는 구형 PHP 버전에 대해서만 쓰기 청크 크기를 8192 바이트로 제한하여 이것을 해결하려고 노력합니다. 이것은 단지 해결 방법 일 뿐이며 영향을받는 버전에 눈에 띄는 성능 페널티가 있습니다.
테스트 스위트를 실행하려면 먼저 이 저장소를 복제한 다음 Composer를 통해 모든 종속성을 설치해야 합니다.
composer install
테스트 스위트를 실행하려면 프로젝트 루트로 이동하여 다음을 실행하십시오.
vendor/bin/phpunit
테스트 스위트에는 안정적인 인터넷 연결에 의존하는 여러 기능 통합 테스트도 포함되어 있습니다. 이것들을 실행하고 싶지 않다면 다음과 같이 건너 뛸 수 있습니다.
vendor/bin/phpunit --exclude-group internet
MIT, LICENSE 파일을 참조하세요.