現在の位置: ホーム> 最新記事一覧> PHP CLIモードでsocket_accept()関数を使用してシンプルなネットワークサービスを構築する方法は?

PHP CLIモードでsocket_accept()関数を使用してシンプルなネットワークサービスを構築する方法は?

M66 2025-05-18

PHPのCLI(コマンドラインインターフェイス)モードでは、 Socket_accept()関数を使用して、低レベルのネットワーク接続を処理できます。これにより、PHPを使用してシンプルなTCPサーバーを構築してクライアントリクエストを受け入れ、応答を送信できます。 PHPは、従来の意味でWebサービスを構築するための好ましい言語ではありませんが、簡単に軽量サービスを実験または構築できるのに十分な基礎となるAPIを提供します。

基本概念

ネットワークサービスを確立する前に、次のPHPソケット機能を理解する必要があります。

例:シンプルなTCPサーバーを構築します

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システムとのデータの交換(ハードウェアデバイスなど)