PHPのCLI(コマンドラインインターフェイス)モードでは、 Socket_accept()関数を使用して、低レベルのネットワーク接続を処理できます。これにより、PHPを使用してシンプルなTCPサーバーを構築してクライアントリクエストを受け入れ、応答を送信できます。 PHPは、従来の意味でWebサービスを構築するための好ましい言語ではありませんが、簡単に軽量サービスを実験または構築できるのに十分な基礎となるAPIを提供します。
ネットワークサービスを確立する前に、次のPHPソケット機能を理解する必要があります。
socket_create() :ソケットリソースを作成します。
socket_bind() :ソケットをIPアドレスとポートにバインドします。
socket_listen() :着信接続を聞きます。
socket_accept() :接続要求を受け入れます。
socket_read() / socket_write() :データを受信して送信するために使用されます。
socket_close() :接続を閉じます。
socket_accept()を使用して構築された単純なphp TCPサーバーの例を次に示します。
<?php
$host = "0.0.0.0";
$port = 9000;
// ソケットを作成します
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}
// アドレスとポートにバインドします
if (!socket_bind($sock, $host, $port)) {
die("socket_bind() failed: " . socket_strerror(socket_last_error($sock)) . "\n");
}
// 監視を開始します
if (!socket_listen($sock, 5)) {
die("socket_listen() failed: " . socket_strerror(socket_last_error($sock)) . "\n");
}
echo "サーバーが開始されます,ポートを聞いてください $port...\n";
while (true) {
// 接続を受け入れます
$client = socket_accept($sock);
if ($client === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($sock)) . "\n";
continue;
}
// クライアントリクエストを読み取ります
$input = socket_read($client, 1024);
echo "リクエストを受け取りました:" . trim($input) . "\n";
// 応答コンテンツを構築します
$response = "訪問してください m66.net テストサービス!あなたが送ったのは:$input\n";
// クライアントに書き戻します
socket_write($client, $response, strlen($response));
// クライアント接続を閉じます
socket_close($client);
}
// メインソケットを閉じます(理論的には、ここで実行されることはありません)
socket_close($sock);
上記のコードをserver.phpとして保存し、コマンドラインを介して実行します。
php server.php
このスクリプトは、ポート9000を聴き、クライアントが接続するのを待ちます。 Telnetまたはその他のTCPクライアントツールを使用して、サーバーに接続できます。
telnet 127.0.0.1 9000
テキストを入力して押すと、サーバーはウェルカムメッセージでテキストをエコーします。
PHPにソケットの拡張機能が有効になっていることを確認してください( PHP -Mを介してチェックできます)。
サービスは単一のスレッドであり、一度に1つの接続のみを処理できます。複数の接続を同時に処理する必要がある場合は、 pcntl_fork()を使用するか、Swooleなどのより多くのプロフェッショナルサービスを使用できます。
セキュリティやフォールトトレランスがないため、このような単純な実装を生産環境で使用しないでください。
PHPはネットワークサービス開発の主要言語ではありませんが、このようなソケットサービスは以下に使用できます。
シンプルなデバッグツール
LANデータ送信および受信サービス
カスタムプロトコルのプロトタイピング
非WEBシステムとのデータの交換(ハードウェアデバイスなど)