高性能で柔軟なネットワークサービスを構築する場合、PHPはWebアプリケーションの構築に限定されず、基礎となるネットワーク通信を処理することもできます。 PHPのソケット拡張機能を介して、カスタムプロトコルに基づいてサーバー側プログラムを作成できます。この記事では、基本原則や完全な例を含むsocket_accept()を使用してカスタムプロトコルサーバーを実装する方法の詳細な紹介について説明します。
socket_accept()は、クライアントからの接続要求を受け入れるPHPソケット拡張機能の関数です。サーバーがsocket_create()とsocket_bind()を介してリスニングを確立すると、 socket_listen()を使用して接続の聴取を開始し、 socket_accept()はこれらの接続を受信する責任があります。クライアント接続が発生すると、クライアントと通信するための新しいソケットを返します。
要するに、そのプロセスは次のとおりです。
ソケットを作成します。
アドレスとポートをバインドします。
接続を聞いてください。
connection( socket_accept() );
クライアントとのコミュニケーション。
接続を閉じます。
JSON形式でリクエストを受信したり、固定形式で応答を返すなど、カスタムプロトコルサーバーを構築する必要があるとします。このサーバーは、HTTPやその他の従来のプロトコルに依存していませんが、TCPレイヤーで直接通信します。
以下は、ローカルポート9000に耳を傾け、クライアントから送信されたJSONリクエストを受信し、処理結果を返すカスタムプロトコルサーバーを実装する方法を示す完全なPHPスクリプトです。
<?php
set_time_limit(0); // スクリプトのタイムアウトを防ぎます
$host = '0.0.0.0';
$port = 9000;
// 1. 作成する socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}
// 2. アドレスとポートをバインドします
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 3. 接続を聞き始めます
if (!socket_listen($socket, 5)) {
die("socket_listen() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "サーバーが開始されます,モニター {$host}:{$port}...\n";
while (true) {
// 4. 接続を受け入れます
$client = socket_accept($socket);
if ($client === false) {
echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
// 5. クライアントリクエストを読み取ります
$input = socket_read($client, 1024);
$input = trim($input);
echo "リクエストを受け取りました: $input\n";
// 分析 JSON 聞く
$request = json_decode($input, true);
$response = [];
if (json_last_error() === JSON_ERROR_NONE && isset($request['action'])) {
if ($request['action'] === 'ping') {
$response = ['status' => 'success', 'message' => 'pong'];
} elseif ($request['action'] === 'hello') {
$response = ['status' => 'success', 'message' => 'Hello from m66.net!'];
} else {
$response = ['status' => 'error', 'message' => '不明な操作'];
}
} else {
$response = ['status' => 'error', 'message' => '聞く格式错误'];
}
// 応答を送信します
$output = json_encode($response) . "\n";
socket_write($client, $output, strlen($output));
// クライアント接続を閉じます
socket_close($client);
}
// サーバーを閉じます socket(理論的には、ここには決してありません)
socket_close($socket);
?>
Telnetまたはカスタムクライアントツールを使用して、テストに接続できます。
telnet 127.0.0.1 9000
貼り付け入力:
{"action":"ping"}
サーバーが返されます:
{"status":"success","message":"pong"}
送信することもできます:
{"action":"hello"}
回答:
{"status":"success","message":"Hello from m66.net!"}
すべての入力と出力は、形式の一貫性を確保する必要があり、JSONをプロトコル本文として使用することをお勧めします。
このサーバーはブロックしており、学習や小規模アプリケーションに適しています。
マルチスレッドまたはイベントベースのモデル(Swooleなど)を生産環境で使用して、並行性のパフォーマンスを向上させる必要があります。
サービスがパブリックネットワークに展開されている場合、IPホワイトリスト、暗号化の検証など、セキュリティ制御を確保する必要があります。
この記事を通して、PHP socket_accept()を使用してカスタムプロトコルサーバーを作成する方法を学びました。基礎となるソケットの原則から完全な例まで、このアプローチはPHPのアプリケーション境界を広げるだけでなく、特定のシナリオに柔軟で信頼できる通信機能を提供します。このアーキテクチャは、一部の軽量サービス、イントラネット通信、またはIoTプロジェクトで大きな可能性を秘めています。