PHPでは、ソケット拡張機能を使用して、ネットワーク通信機能を非常に柔軟に実装し、それを使用して基本的なネットワークサーバーを作成することもできます。この記事では、socket_listen()およびsocket_accept()関数を使用して、単純なTCPサーバーを構築する方法に焦点を当てます。
socket_listen()
この関数は、クライアント接続リクエストを待機するIPとポートがバインドされたソケットリソースをリッスンするために使用されます。
socket_accept()
この関数は、着信クライアント接続要求を受け入れるために使用され、クライアントと通信するための新しいソケットリソースを返します。
ソケットリソースを作成する( socket_create )
IPとポートをバインドする( socket_bind )
ポートを聞く( socket_listen )
クライアント接続のループと受け入れ( socket_accept )
データを読み書きし、通信を完了します
クライアントとサーバーのソケットを閉じます
<?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は、高性能サーバー専用に設計された言語ではありませんが、小規模サービスをすばやくプロトタイプまたは単純なネットワークインタラクションアプリケーションを作成するために使用することは非常に実用的です。