ネットワークプログラミングでは、PHPはWebアプリケーションの開発に使用されるだけでなく、TCPサーバーなどの低レベルのネットワーク通信プログラムを作成するためにも使用できます。 socket_accept()は、クライアント接続を受け入れるためのPHPの重要な機能の1つです。この記事では、シンプルなTCPサーバーを段階的に構築し、重要なポイントを説明します。
socket_accept()は、PHPソケット拡張機能の関数であり、サーバー上にリッスンして、確立されたソケットで接続要求を受信します。クライアントが接続を要求すると、 socket_accept()は、メインのリスニングソケットではなく、クライアントとの通信に使用される新しいソケットインスタンスを返します。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}
このコード行は、IPv4( AF_INET )のTCPソケット( SOCK_STREAM )を作成し、プロトコルタイプはTCP( SOL_TCP )です。
if (!socket_bind($socket, '0.0.0.0', 12345)) {
die("socket_bind() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
このステップは、ソケットを12345などのローカルIPとポートに結合します。
if (!socket_listen($socket, 5)) {
die("socket_listen() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
着信接続の聴取を開始します。5は、最大待機接続キューの長さを示します。
while (true) {
echo "クライアント接続を待っています...\n";
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
$welcomeMsg = "ようこそ m66.net の PHP TCP サーバ!\n";
socket_write($clientSocket, $welcomeMsg, strlen($welcomeMsg));
// クライアント情報をお読みください
$input = socket_read($clientSocket, 1024);
echo "クライアントメッセージを受け取りました: " . $input;
// クライアントに応答します
$response = "あなたはそれを送った: " . trim($input) . "\n";
socket_write($clientSocket, $response, strlen($response));
// クライアント接続を閉じます
socket_close($clientSocket);
}
上記のコードでは、サーバーはクライアントが接続できるように無限にループします。接続が確立されると、ウェルカムメッセージが送信され、クライアントの入力が読み取られ、そのまま返されます。
上記のコードは無限のループサーバーですが、実際の使用で割り込みメカニズムまたは信号処理を追加する必要があります。サーバーをシャットダウンするコードは次のとおりです。
socket_close($socket);
Telnetを使用して、このTCPサーバーをテストできます。
telnet m66.net 12345
接続が成功した場合、サーバーによって返された歓迎メッセージが表示されます。
PHPのソケット拡張機能はデフォルトでは有効ではありません。PHP.iniでソケットが有効になっていることを確認してください。
コマンドラインを使用してスクリプトを実行してください。 Web環境は、このような長い間接続されたサービスを実行するのに適していません。
実際の展開中に、例外処理、ロギング、マルチプロセス処理などの機能を追加する必要があります。
この記事を通して、PHP socket_accept()関数を使用してシンプルなTCPサーバーを作成する方法を学びました。 PHPはWebサービスに適した言語ではありませんが、基本的なニーズを満たすために必要なツールも提供します。この小さなサーバーの例は、PHPの強力な柔軟性を示しています。