PHPのソケットプログラミングでは、 socket_set_block()関数を使用して、ソケットをブロッキングモードに設定します。ブロッキングモードでは、 socket_accept()やsocket_read( )などのI/O操作は、データが利用可能になるか、接続が完了するまで待機します。これは、クライアントリクエストを同期する必要があるサーバープログラムで特に重要です。
この記事では、socket_create()とsocket_bind()を組み合わせて、ブロッキングモードに基づいてソケットサーバーを作成する方法を示します。
socket_set_block(リソース$ socket):bool
この関数は、指定されたソケットをブロッキングモードに設定し、戻り値はブール値であり、設定が成功したかどうかを示します。
ブロッキングモードはデフォルトの動作ですが、 socket_set_nonblock()に電話したことがある場合は、 socket_set_block()を使用して復元する必要があります。
以下は、socket_create() 、 socket_bind() 、 socket_listen() 、 socket_accept()などの関数を使用して、完全なphpサーバーの例です。
<code>&lt;?php // tcp socket $ socket = socket_create(af_inet、sock_stream、sol_tcp); if($ socket === false){die( "socket_create()failed:"。socket_strerror(socket_last_error())。 "\ n"); } //ブロッキングモードに設定します
if(!socket_set_block($ socket)){
die( "ブロッキングモードに設定できません:"。socket_strerror(socket_last_error($ socket))。 "\ n");
}
// IPとポートをバインドします
$ host = '0.0.0.0';
$ port = 12345;
if(!socket_bind($ socket、$ host、$ port)){
die( "socket_bind()failed:"。socket_strerror(socket_last_error($ socket))。 "\ n");
}
//接続を聞きます
if(!socket_listen($ socket、5)){
die( "socket_listen()failed:"。socket_strerror(socket_last_error($ socket))。 "\ n");
}
echo "サーバーが起動し、{$ host}で聞く:{$ port} ... \ n";
while(true){
エコー「クライアント接続を待っています... \ n」;
$ client = socket_accept($ socket);
if($ client === false){
echo "socket_accept()failed:"。 socket_strerror(socket_last_error($ socket))。 "\ n";
続く;
}
echo "クライアントが接続されています,データを読む...\n";
// クライアントメッセージを読む(データが受信されるまでブロックします)
$input = socket_read($client, 1024);
echo "メッセージを受け取りました: " . trim($input) . "\n";
$response = "サーバーへの接続へようこそ!あなたは送った:" . trim($input);
socket_write($client, $response, strlen($response));
socket_close($client);
}
//メインソケットを閉じます
socket_close($ socket);
</code>
Telnetツールを使用して、サーバーに接続できます。
telnet 127.0.0.1 12345
任意のテキストを入力すると、サーバーが送信したものに応答します。
ブロッキングモードは、次のシナリオに適しています。
シンプルなシリアルサーバーモデル
一度に1つのクライアント接続のみが処理されます
リアルタイムがほとんど必要ないサービス
ただし、高い同時アプリケーションの場合、通常、非ブロッキングモードをマルチプロセスまたは非同期メソッドと組み合わせて使用することをお勧めします。
デバッグと展開では、問題をすばやく見つけるために、error_logまたはログファイルと組み合わせてソケットエラー情報を出力することをお勧めします。たとえば、エラーはファイルに書き込むことができます。
error_log("socket_error: " . socket_strerror(socket_last_error()), 3, "/var/log/php_socket_error.log");
socket_set_block()を介して、ソケットのi/o動作を柔軟に制御できます。場合によっては、明示的にブロッキングモードを設定すると、デフォルトの動作の変更により例外の問題を回避できます。 socket_create()およびsocket_bind()と組み合わせると、論理順序が正しいことを確認し、最初に作成してからバインドしてからリスニングモードとブロッキングモードを設定し、安定したソケットサーバープログラムを構築します。
上記の例では、サーバーに展開すると、ブラウザまたはAPIリクエストを介して接続テストをhttp://gitbox.net:12345に送信できます(実際にはIPおよびポート構成に従って)。
この記事がsocket_set_block()の使用を理解するのに役立つことを願っています。