PHPでは、ソケット拡張機能を介してネットワークサービスプログラムを作成できます。その中で、 socket_accept()関数は、TCPベースのサーバーアプリケーションを構築する際の重要な機能の1つです。この記事では、完全な例を使用して、 socket_accept()を使用してシンプルなエコーサーバー(Echo Server)を実装する方法について説明します。
socket_accept()は、クライアントからの接続要求を受け入れるために使用されます。この関数は、接続が入るまでサーバーソケットでブロックされます。成功すると、クライアントとの通信に使用できる新しいソケットリソースを返します。
文法:
resource socket_accept ( resource $socket )
$ socketは、 Socket_create()およびsocket_bind()を介して作成および聴くサーバーソケットです。
クライアントと通信するソケットリソースを返します。
簡単なエコーサーバーを作成するための完全な手順は次のとおりです。
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}
$host = '0.0.0.0';
$port = 12345;
if (!socket_bind($server, $host, $port)) {
die("socket_bind() 失敗: " . socket_strerror(socket_last_error($server)) . "\n");
}
if (!socket_listen($server, 5)) {
die("socket_listen() 失敗: " . socket_strerror(socket_last_error($server)) . "\n");
}
echo "サーバーが開始されます,ポートを聞いてください $port ...\n";
while (true) {
$client = socket_accept($server);
if ($client === false) {
echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($server)) . "\n";
continue;
}
$msg = "EchoサーバーへのConnectへようこそ!コンテンツを入力してください,サーバーはそのまま返されます。\n";
socket_write($client, $msg, strlen($msg));
while (true) {
$input = socket_read($client, 2048, PHP_NORMAL_READ);
if ($input === false || trim($input) === 'exit') {
break;
}
$input = trim($input);
$output = "あなたは入りました: $input\n";
socket_write($client, $output, strlen($output));
}
socket_close($client);
echo "クライアント接続が閉じました。\n";
}
サーバーを停止する必要がある場合は、メインソケットを閉じることができます。
socket_close($server);
TELNETまたはTCP接続をサポートするクライアントツールを使用して、サーバーに接続できます。
telnet m66.net 12345
接続が成功した後、サーバーはウェルカムメッセージに応答し、入力したものをそのまま返します。
PHPのソケット拡張はデフォルトでは有効ではなく、 PHP.iniで有効にする必要があります。
この例はブロッキングモードであり、デモンストレーションと教育の目的に適しています。実際の生産環境では、非ブロッキングモードを使用するか、 stream_select()などのメソッドを使用してマルチクライアントサポートを実現することをお勧めします。
ファイアウォールとオペレーティングシステムにより、リスニングポートが通信できるようにしてください。
socket_accept()を介して、PHPは基本的なTCPネットワークアプリケーションを構築できます。この記事で実装されているEchoサーバーは、ソケットプログラミングメカニズムを理解するための良い出発点です。これに基づいてさらに拡張して、チャットルーム、リモートコントロールなど、より複雑なネットワークサービスを実装できます。
Echo Serverの例は、ソケットプログラミングで最も基本的なモデルの1つですが、ネットワークプログラミングへのドアが開きます。これらの基礎を習得することにより、ネットワーク通信におけるPHPの可能性は無限に拡大されます。