【PHP8.x】stream_socket_server関数の使い方

stream_socket_server関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

stream_socket_server関数は、ネットワーク上でクライアントからの接続を受け入れるためのサーバーソケットを作成し、接続待機状態にする関数です。この関数を使用することで、PHPスクリプトをネットワークサーバーとして機能させ、他のプログラムやクライアントからの通信を待ち受けることが可能になります。

具体的には、local_socketという引数で、どのプロトコル(例えば、tcp://udp://)を使って、どのIPアドレスとポート番号(例えば、127.0.0.1:8000)で接続を待つのかを指定します。これにより、TCP/IPプロトコルだけでなく、UDPプロトコルやUnixドメインソケットなど、様々な種類のサーバーソケットを作成することができます。

関数が正常に実行された場合、クライアントからの接続を待ち受けるための『ストリームリソース』が返されます。このストリームリソースは、実際にクライアントが接続を試みてきた際に、その接続を受け入れるための別の関数(例えば stream_socket_accept)に渡して使用します。これにより、クライアントとの具体的な通信経路を確立することができます。

もしソケットの作成に失敗した場合は、この関数はfalseを返します。その際、errnoerrstrという引数を使用することで、なぜ失敗したのかというエラーコードとエラーメッセージの詳細な情報を取得し、適切なエラー処理を行うことができます。

この関数は、ウェブサーバーのような常に特定のポートで接続を待ち受け、データを受け取ったり応答を返したりするような、ネットワークを利用したアプリケーションをPHPで開発する際の基盤として非常に重要な役割を担っています。

構文(syntax)

1stream_socket_server(
2    string $address,
3    ?int &$error_code = null,
4    ?string &$error_message = null,
5    int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
6    ?resource $context = null
7): resource|false

引数(parameters)

string $address, ?int &$error_code = null, ?string &$error_message = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, ?resource $context = null

  • string $address: サーバーがバインドするアドレスとポートを指定する文字列。例: "tcp://127.0.0.1:8000" や "udp://:9000"
  • ?int &$error_code = null: エラーが発生した場合にエラーコードが格納される整数型の変数への参照。
  • ?string &$error_message = null: エラーが発生した場合にエラーメッセージが格納される文字列型の変数への参照。
  • int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN: サーバーの動作を制御するフラグ。デフォルトはバインドとリスニング。
  • ?resource $context = null: ストリームコンテキストを指定するリソース。

戻り値(return)

resource|false

成功した場合、ソケットリソースを返します。失敗した場合は false を返します。

サンプルコード

PHP stream_socket_server でサーバーを起動する

1<?php
2
3// ソケットサーバーのアドレス
4$address = "tcp://127.0.0.1:8000";
5
6// エラーコードとエラーメッセージを格納する変数
7$error_code = 0;
8$error_message = '';
9
10// ソケットサーバーを作成
11$server = stream_socket_server(
12    $address,
13    $error_code,
14    $error_message,
15    STREAM_SERVER_BIND | STREAM_SERVER_LISTEN
16);
17
18// サーバー作成に失敗した場合
19if (!$server) {
20    echo "Failed to create server: " . $error_message . " (" . $error_code . ")\n";
21    exit(1);
22}
23
24echo "Server listening on " . $address . "\n";
25
26// クライアントからの接続を待ち受ける
27while (true) {
28    // クライアントからの接続を受け入れる
29    $client = stream_socket_accept($server, -1);
30
31    if ($client) {
32        echo "Client connected\n";
33
34        // クライアントからのデータを読み込む
35        $data = fread($client, 1024);
36        echo "Received: " . $data . "\n";
37
38        // クライアントにデータを送信する
39        fwrite($client, "Hello, client!\n");
40
41        // クライアントとの接続を閉じる
42        fclose($client);
43        echo "Client disconnected\n";
44    }
45}
46
47// サーバーソケットを閉じる (通常は到達しない)
48fclose($server);

このサンプルコードは、PHPのstream_socket_server関数を使用してシンプルなTCPソケットサーバーを構築する方法を示しています。stream_socket_server関数は、指定されたアドレスでサーバーソケットを作成し、クライアントからの接続を待ち受けます。

stream_socket_server関数の第一引数 $address には、サーバーがリッスンするアドレス(例:tcp://127.0.0.1:8000)を指定します。第二引数 $error_code と第三引数 $error_message は、それぞれエラーコードとエラーメッセージを受け取るための変数です。サーバーの作成に失敗した場合、これらの変数にエラー情報が格納されます。第四引数 $flags は、ソケットの動作を制御するためのフラグです。ここでは STREAM_SERVER_BINDSTREAM_SERVER_LISTEN を組み合わせて、アドレスにバインドし、接続をリッスンするサーバーソケットを作成しています。第五引数 $context は、ソケットコンテキストを指定します。省略した場合はデフォルトのコンテキストが使用されます。

関数が成功すると、リソース型のソケットが返されます。失敗した場合は false が返されます。

サンプルコードでは、まずstream_socket_server関数を使ってサーバーソケットを作成し、エラーが発生した場合はエラーメッセージを出力して終了します。サーバーが正常に作成された場合は、クライアントからの接続を待ち受けるループに入ります。stream_socket_accept関数でクライアントからの接続を受け入れ、クライアントからデータを受信し、メッセージを送信して接続を閉じます。最後にサーバーソケットを閉じます。

このコードは、ネットワークプログラミングの基礎を学ぶ上で役立ちます。

stream_socket_server関数を使う際の注意点です。まず、$addressは、利用可能なプロトコル(tcp、udpなど)とIPアドレス、ポート番号を正しく指定する必要があります。ポート番号が他のプロセスで使用されていないか確認してください。$error_code$error_messageは、サーバー作成に失敗した場合の原因特定に役立ちます。必ずエラー処理を行いましょう。STREAM_SERVER_BIND | STREAM_SERVER_LISTENフラグは、ソケットをアドレスにバインドし、接続をlisten状態にするために重要です。このサンプルコードは無限ループでクライアントを待ち受けるため、プログラムを停止するには明示的な終了処理が必要です。本番環境では、接続数制限やタイムアウト処理などを実装し、セキュリティとリソース管理を強化してください。

関連コンテンツ

【PHP8.x】stream_socket_server関数の使い方 | いっしー@Webエンジニア