現在の位置: ホーム> 最新記事一覧> socket_create、socket_bind、socket_set_blockを組み合わせる方法

socket_create、socket_bind、socket_set_blockを組み合わせる方法

gitbox 2025-05-28

PHPのソケットプログラミングでは、 socket_set_block()関数を使用して、ソケットをブロッキングモードに設定します。ブロッキングモードでは、 socket_accept()socket_read( )などのI/O操作は、データが利用可能になるか、接続が完了するまで待機します。これは、クライアントリクエストを同期する必要があるサーバープログラムで特に重要です。

この記事では、socket_create()socket_bind()を組み合わせて、ブロッキングモードに基づいてソケットサーバーを作成する方法を示します。

1。socket_set_blockの紹介

socket_set_block(リソース$ socket):bool

この関数は、指定されたソケットをブロッキングモードに設定し、戻り値はブール値であり、設定が成功したかどうかを示します。

ブロッキングモードはデフォルトの動作ですが、 socket_set_nonblock()に電話したことがある場合は、 socket_set_block()を使用して復元する必要があります。

2。ブロッキングモード接続の実装の完全な例

以下は、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>

3。クライアントテスト方法

Telnetツールを使用して、サーバーに接続できます。

 telnet 127.0.0.1 12345

任意のテキストを入力すると、サーバーが送信したものに応答します。

4。実用的なアプリケーションシナリオ

ブロッキングモードは、次のシナリオに適しています。

  • シンプルなシリアルサーバーモデル

  • 一度に1つのクライアント接続のみが処理されます

  • リアルタイムがほとんど必要ないサービス

ただし、高い同時アプリケーションの場合、通常、非ブロッキングモードをマルチプロセスまたは非同期メソッドと組み合わせて使用​​することをお勧めします。

5。ヒント

デバッグと展開では、問題をすばやく見つけるために、error_logまたはログファイルと組み合わせてソケットエラー情報を出力することをお勧めします。たとえば、エラーはファイルに書き込むことができます。

 error_log("socket_error: " . socket_strerror(socket_last_error()), 3, "/var/log/php_socket_error.log");

6。概要

socket_set_block()を介して、ソケットのi/o動作を柔軟に制御できます。場合によっては、明示的にブロッキングモードを設定すると、デフォルトの動作の変更により例外の問題を回避できます。 socket_create()およびsocket_bind()と組み合わせると、論理順序が正しいことを確認し、最初に作成してからバインドしてからリスニングモードとブロッキングモードを設定し、安定したソケットサーバープログラムを構築します。

上記の例では、サーバーに展開すると、ブラウザまたはAPIリクエストを介して接続テストをhttp://gitbox.net:12345に送信できます(実際にはIPおよびポート構成に従って)。

この記事がsocket_set_block()の使用を理解するのに役立つことを願っています。