ReactPHP 用の非同期ストリーミング プレーンテキスト TCP/IP および安全な TLS ソケット サーバーとクライアント接続。
開発バージョン:このブランチには、今後の v3 リリースのコードが含まれています。現在の安定版 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
値を返してもよい(MAY)。
それ以外の場合は、 tcp://127.0.0.1:8080
、 tcp://[::1]:80
、 tls://127.0.0.1:443
などの完全なアドレス (URI) を文字列値として返します。 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
値を返してもよい(MAY)。
それ以外の場合は、 tcp://127.0.0.1:8080
、 tcp://[::1]:80
、 tls://127.0.0.1:443
などの完全なアドレス (URI) を文字列値として返します。 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
値を返してもよい(MAY)。
それ以外の場合は、 tcp://127.0.0.1:8080
、 tcp://[::1]:80
、 tls://127.0.0.1:443
unix://example.sock
などの完全なアドレス (URI) を文字列値として返します。 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
イベントを発行してはなりません (SHOULD)。
$ 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()
を呼び出しても何の効果もありません(SHOULD NOT)。同様に、 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 が有効であるように見えても、その URI のリッスンが失敗した場合 (ポートがすでに使用されている場合、または 1024 未満のポートに root アクセスが必要な場合など)、 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 ハンドシェイクを実行します。したがって、有効な TLS コンテキスト オプションが必要です。PEM でエンコードされた証明書ファイルを使用している場合、その最も基本的な形式は次のようになります。
$ 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
を使用する必要があります (SHOULD)。
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 ();
ソケットがリッスンしているホストを変更するには、コンストラクターに提供される最初のパラメーター (オプションで前にtcp://
スキームを付けたもの) を介して IP アドレスを指定できます。
$ 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 が有効であるように見えても、その URI のリッスンが失敗した場合 (ポートがすでに使用されている場合、または 1024 未満のポートに root アクセスが必要な場合など)、 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 接続を待機するTcpServer
インスタンスをラップすることで実現され、接続ごとに TLS ハンドシェイクを実行します。したがって、有効な TLS コンテキスト オプションが必要です。PEM でエンコードされた証明書ファイルを使用している場合、その最も基本的な形式は次のようになります。
$ 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
を使用する必要があります (SHOULD)。
このクラスは、このオブジェクトに使用するイベント ループ インスタンスを渡すために使用できる、オプションのLoopInterface|null $loop
パラメーターを取ります。デフォルトのループを使用するために、ここでnull
値を使用できます。特定のイベント ループ インスタンスを明示的に使用することが確実でない限り、この値を指定しないでください。
高度な使用方法: 最初のパラメータとして任意の
ServerInterface
許可するにもかかわらず、何をしているのかわからない場合は、最初のパラメータとしてTcpServer
インスタンスを渡す必要があります (SHOULD)。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 が有効であるように見えても、その 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 );
…
});
詳細については、2 番目の例も参照してください。
この制限を超えた場合にサーバーが自動的に接続を拒否 (クローズ) するようにするには、オープン接続の最大数を渡す必要があります。この場合、これを通知するために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 接続を作成します。これは通常、依存関係の注入によって行われるため、この実装をこのインターフェイスの他の実装と実際に交換するのは非常に簡単です。
このインターフェイスでは、次の 1 つのメソッドのみが提供されます。
connect(string $uri): PromiseInterface<ConnectionInterface>
メソッドを使用して、指定されたリモート アドレスへのストリーミング接続を作成できます。
これは、成功した場合はConnectionInterface
実装するストリームで満たされる Promise を返し、接続が成功しなかった場合はException
で拒否します。
$ 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 は、保留中のときにキャンセルできる方法で実装しなければなりません (MUST)。保留中の 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()
メソッドは、connect()
メソッドに指定されたターゲット Unix ドメイン ソケット (UDS) パスを返します。これには、unix://
スキーム (例:unix:///tmp/demo.sock
) が含まれます。getLocalAddress()
メソッドは、この値が UDS 接続に適用されないため、ほとんどの場合null
値を返します。
内部では、 Connector
は、このパッケージに実装されている下位レベルのコネクタの上位レベルのファサードとして実装されています。これは、すべての機能と実装の詳細も共有することを意味します。上位レベルのプロトコル実装でタイプヒントを使用したい場合は、代わりに汎用のConnectorInterface
を使用する必要があります (SHOULD)。
v1.4.0
以降、 Connector
クラスは、ホスト名が指定されると、デフォルトで Happy Eyeballs アルゴリズムを使用して IPv4 または IPv6 経由で自動的に接続します。これにより、IPv4 と IPv6 の両方を同時に使用して (IPv6 を優先して) 自動的に接続が試行されるため、不完全な IPv6 接続またはセットアップでユーザーが直面する一般的な問題が回避されます。 IPv4 ルックアップのみを実行し、単一の IPv4 接続のみを試行するという古い動作に戻したい場合は、次のようにConnector
を設定できます。
$ connector = new React Socket Connector ([
' happy_eyeballs ' => false
]);
同様に、次のようにデフォルトの DNS 動作に影響を与えることもできます。 Connector
クラスは、システムの DNS 設定の検出を試み (システム設定を特定できない場合は、フォールバックとして Google のパブリック DNS サーバー8.8.8.8
を使用します)、デフォルトですべてのパブリック ホスト名を基礎となる IP アドレスに解決します。カスタム 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 をキャンセルすることでキャンセルできます。
$ promise = $ tcpConnector -> connect ( ' 127.0.0.1:80 ' );
$ promise -> cancel ();
保留中の Promise でcancel()
呼び出すと、基礎となるソケット リソースが閉じられるため、保留中の TCP/IP 接続がキャンセルされ、結果として生じる Promise が拒否されます。
このクラスは、このオブジェクトに使用するイベント ループ インスタンスを渡すために使用できる、オプションのLoopInterface|null $loop
パラメーターを取ります。デフォルトのループを使用するために、ここでnull
値を使用できます。特定のイベント ループ インスタンスを明示的に使用することが確実でない限り、この値は指定しないでください。
必要に応じて、次のように追加のソケット コンテキスト オプションをコンストラクターに渡すことができます。
$ tcpConnector = new React Socket TcpConnector ( null , [
' bindto ' => ' 192.168.0.1:0 '
]);
このクラスでは、IP ポートの組み合わせにのみ接続できることに注意してください。指定された URI が無効である場合、有効な IP アドレスとポートが含まれていない場合、またはその他のスキームが含まれている場合は、 InvalidArgumentException
で拒否されます。
指定された URI が有効であるように見えても、その URI への接続が失敗した場合 (リモート ホストが接続を拒否した場合など)、 RuntimeException
で拒否されます。
ホスト名とポートの組み合わせに接続する場合は、次の章も参照してください。
高度な使用法: 内部的に、
TcpConnector
各ストリーム リソースに空のコンテキストリソースを割り当てます。宛先 URI にhostname
クエリ パラメータが含まれている場合、その値は TLS ピア名の設定に使用されます。これはSecureConnector
およびDnsConnector
によってピア名を確認するために使用され、カスタム TLS ピア名が必要な場合にも使用できます。
HappyEyeBallsConnector
クラスはConnectorInterface
を実装し、任意のホスト名とポートの組み合わせへのプレーンテキスト TCP/IP 接続を作成できるようにします。内部的には、 RFC6555
およびRFC8305
の Happy Eyeballs アルゴリズムを実装して、IPv6 および IPv4 のホスト名をサポートします。
これは、指定されたTcpConnector
インスタンスを修飾することによって行われ、最初に DNS (該当する場合) 経由で指定されたドメイン名を検索し、次に解決されたターゲット IP アドレスへの基礎となる TCP/IP 接続を確立します。
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 をキャンセルすることでキャンセルできます。
$ 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 レコードに対して 2 つの DNS ルックアップを送信します。次に、すべての IP アドレス (v6 と v4 の両方) を使用し、50 ミリ秒の間隔を置いてすべての IP アドレスへの接続を試みます。 IPv6 アドレスと IPv4 アドレスを切り替える。接続が確立されると、他のすべての DNS ルックアップと接続試行はキャンセルされます。
DnsConnector
クラスはConnectorInterface
実装し、任意のホスト名とポートの組み合わせへのプレーンテキスト TCP/IP 接続を作成できるようにします。
これは、指定されたTcpConnector
インスタンスを修飾することによって行われ、最初に DNS (該当する場合) 経由で指定されたドメイン名を検索し、次に解決されたターゲット IP アドレスへの基礎となる TCP/IP 接続を確立します。
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 をキャンセルすることでキャンセルできます。
$ 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
を実装し、このようなUNIXドメインソケット(UDS)パスに接続できます。
$ connector = new React Socket UnixConnector ();
$ connector -> connect ( ' /tmp/demo.sock ' )-> then ( function ( React Socket ConnectionInterface $ connection ) {
$ connection -> write ( " HELLO n" );
});
UNIXドメインソケットに接続することは原子操作です。つまり、その約束はすぐに解決(解決または拒否)になります。そのため、結果として生じる約束にcancel()
を呼び出すことは効果がありません。
getRemoteAddress()
メソッドは、connectunix://
スキームで前にunix:///tmp/demo.sock
connect()
メソッドに与えられたターゲットUnixドメインソケット(UDS)パスを返します。getLocalAddress()
メソッドは、この値がここでUDS接続に適用されないため、null
値を返す可能性が最も高くなります。
このクラスは、オプションのLoopInterface|null $loop
パラメーターを使用します。このパラメーターを使用して、このオブジェクトに使用するイベントループインスタンスを渡すために使用できます。ここでnull
値を使用して、デフォルトのループを使用できます。特定のイベントループインスタンスを明示的に使用することを確信していない限り、この値を指定すべきではありません。
FixedUriConnector
クラスは、 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 を使用することです。作曲家は初めてですか?
このプロジェクトがリリースされると、SemVer に続くことになります。現時点では、これにより最新の開発バージョンがインストールされます。
composer require react/socket:^3@dev
バージョンアップの詳細については、CHANGELOG も参照してください。
このプロジェクトはあらゆるプラットフォームで実行することを目的としているため、PHP 拡張機能は必要なく、PHP 7.1 から現在の PHP 8+ での実行をサポートします。このプロジェクトでは、サポートされている最新の PHP バージョンを使用することを強くお勧めします。
レガシーPHP <7.3.3(およびPHP <7.2.15)は、Feof()が断片化されたTLSレコードで100%のCPU使用でブロックされる可能性があるバグに苦しんでいます。 TLSバッファーの古いデータを避けるために、常に完全な受信バッファーを一度に消費することにより、これを回避しようとします。これは、行儀の良い仲間のための高いCPU使用を回避することが知られていますが、これは高スループットシナリオのために非常に大きなデータチャンクを引き起こす可能性があります。ネットワークI/Oバッファーまたは影響を受けるバージョン上の悪意のあるピアのために、バグの動作を引き起こすことができます。アップグレードを強くお勧めします。
Legacy PHP <7.1.4は、TLSストリームを介して大量のデータを一度に書くとき、バグに苦しんでいます。古いPHPバージョンのみで、書き込みチャンクサイズを8192バイトに制限することにより、これを回避しようとします。これは単なるワークアラウンドであり、影響を受けるバージョンで顕著なパフォーマンスペナルティがあります。
テスト スイートを実行するには、まずこのリポジトリのクローンを作成し、次に Composer を通じてすべての依存関係をインストールする必要があります。
composer install
テスト スイートを実行するには、プロジェクト ルートに移動して次を実行します。
vendor/bin/phpunit
テストスイートには、安定したインターネット接続に依存する多数の機能統合テストも含まれています。あなたがこれらを実行したくない場合、彼らは単にこのようにスキップすることができます:
vendor/bin/phpunit --exclude-group internet
MIT の場合は、LICENSE ファイルを参照してください。