現在の位置: ホーム> 最新記事一覧> socket_listen()とともに、基本的なネットワークサーバーを作成します

socket_listen()とともに、基本的なネットワークサーバーを作成します

M66 2025-05-28

PHPでは、ソケット拡張機能を使用して、ネットワーク通信機能を非常に柔軟に実装し、それを使用して基本的なネットワークサーバーを作成することもできます。この記事では、socket_listen()およびsocket_accept()関数を使用して、単純なTCPサーバーを構築する方法に焦点を当てます。

socket_listen()とsocket_accept()とは何ですか?

  • socket_listen()
    この関数は、クライアント接続リクエストを待機するIPとポートがバインドされたソケットリソースをリッスンするために使用されます。

  • socket_accept()
    この関数は、着信クライアント接続要求を受け入れるために使用され、クライアントと通信するための新しいソケットリソースを返します。

基本的なプロセス分析

  1. ソケットリソースを作成する( socket_create

  2. IPとポートをバインドする( socket_bind

  3. ポートを聞く( socket_listen

  4. クライアント接続のループと受け入れ( socket_accept

  5. データを読み書きし、通信を完了します

  6. クライアントとサーバーのソケットを閉じます

サンプルコード

<?php
// 作成するTCP socket(AF_INETプロトコルファミリー,ストリーミング)
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
    die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}

// バインドIPおよびポート
$address = '0.0.0.0';  // すべてのネットワークインターフェイスを聞いてください
$port = 8080;
if (!socket_bind($server, $address, $port)) {
    die("socket_bind() 失敗: " . socket_strerror(socket_last_error($server)) . "\n");
}

// 監視を開始します,接続を待つことを可能にするキューの長さはです5
if (!socket_listen($server, 5)) {
    die("socket_listen() 失敗: " . socket_strerror(socket_last_error($server)) . "\n");
}

echo "サーバーが開始されます,モニター {$address}:{$port}\n";

while (true) {
    // クライアント接続をブロックして待っています
    $client = socket_accept($server);
    if ($client === false) {
        echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($server)) . "\n";
        continue;
    }

    // クライアントからデータを読み取ります,最大読み取り1024バイト
    $input = socket_read($client, 1024);
    if ($input === false) {
        echo "socket_read() 失敗: " . socket_strerror(socket_last_error($client)) . "\n";
        socket_close($client);
        continue;
    }

    echo "クライアントデータを受信しました: $input\n";

    // データの処理 - これがクライアントのメッセージへの簡単な返信です
    $response = "こんにちは,クライアント!あなたが送るデータはです:" . trim($input) . "\n";
    socket_write($client, $response, strlen($response));

    // 关闭クライアント连接
    socket_close($client);
}

// サーバーをシャットダウンしますsocket(通常、私はここに行きません)
socket_close($server);
?>

説明します

  • 実際には、完全なプロトコルパーサーの実装や複数のクライアントを非同期に処理するなど、ニーズに応じて読み取りおよび書き込みロジックを拡張できます。

  • リスナーのIPは、特定のアドレスに設定したり、 「0.0.0.0」を使用して利用可能なすべてのネットワークインターフェイスをリッスンしたりできます。

  • ポートを使用してポートを使用してポート番号を避ける必要があります。通常、1024を超えるポートを選択する必要があります。

  • 上記のコードは、初心者の理解に適した、同期的にブロックされた単一の読み取りサーバーです。

まとめ

socket_listen()およびsocket_accept()を介して、PHPは基本的なネットワーク通信機能を実現するために非常に直接TCPサーバープログラムを構築できます。 PHPは、高性能サーバー専用に設計された言語ではありませんが、小規模サービスをすばやくプロトタイプまたは単純なネットワークインタラクションアプリケーションを作成するために使用することは非常に実用的です。