PHPでは、 socket_export_stream()は非常に実用的な機能です。基礎となるソケット拡張リソースを高レベルのストリームストリームに変換することができます。これにより、 fwrite() 、 stream_socket_sendto() 、 stream_select()などのより豊富なストリーミング関数を使用して、データの送信と受信を処理するために使用できます。この変換は、イベント駆動型モデルやストリームコンテキストコントロールなど、 Stream_*シリーズ関数が統合されている環境で特に役立ちます。
ただし、 socket_export_stream()を使用した後、多くの開発者は、strame_socket_sendto()などの関数と組み合わせてデータを正しく送信する方法について質問があります。この記事では、このプロセスを詳細に分析します。
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '0.0.0.0', 12345);
// 意思 socket リソースをに変換します stream リソース
$stream = socket_export_stream($socket);
この$ストリームは、ファイルのように操作できるPHPストリームリソースです。この時点で、データ処理にはソケット関数の代わりにストリーム関数を使用できます。
Stream_Socket_Sendto()は、通常、接続プロトコル(UDPなど)なしでデータを送信するために使用されます。変換されたストリーミングリソースを使用する場合、いくつかのポイントに注意する必要があります。
ストリームはバッファーされていないか、手動でリフレッシュする必要があります( fflush )。
アドレス形式は標準のURI形式である必要があります。
UDPの場合、宛先アドレスを提供する必要があります。
$remote = 'udp://m66.net:12345';
$message = "Hello via stream!";
// 知らせ:stream 書くことができなければなりません,そして、ターゲットアドレスを正しくする必要があります
$bytesSent = stream_socket_sendto($stream, $message, 0, $remote);
if ($bytesSent === false) {
echo "失敗した送信。\n";
} else {
echo "正常に送信されます $bytesSent バイト。\n";
}
Stream_Select()を使用すると、複数のストリーム(複数のsocket_export_stream変換リソースなど)が同時に読みやすく書くことができるかどうかを監視できます。これは、非ブロッキングI/Oプログラミングに非常に適しています。
$read = [$stream];
$write = null;
$except = null;
$changed = stream_select($read, $write, $except, 5);
if ($changed > 0) {
$data = fread($stream, 1024);
echo "受信したデータ:$data\n";
}
もちろん、ターゲットアドレスを明示的に指定することなく、 fwrite()を直接使用することもできます。
fwrite($stream, "Simple write to stream\n");
この方法は、接続指向のプロトコルまたはリモートUDPソケットが結合後に確立されたことに適していることに注意する必要があります。
Socket_export_stream()を介して元のソケットをPHPストリームに変換した後、 Stream_socket_sendto() 、 fwrite() 、 stream_Select()などの高度な関数を簡単に使用して、データを送信および受信し、コードの保守性と柔軟性を向上させます。使用中、ターゲットアドレス形式、リソースの読み取りおよび書き込みステータス、およびプロトコルの特性(UDPが接続されているかどうかなど)に注意を払う必要があります。適切な構成の後、このアプローチは、最新の高性能ネットワーク通信コンポーネントの構築に非常に適しています。