ホームページ >バックエンド開発 >PHPチュートリアル >phpの詳細な説明と分析例socket_PHPチュートリアル
この章では、魅力的でわかりにくいソケットについて学びます。ソケットは、PHP ではあまり活用されていない機能です。今日は、クライアント接続を使用できるサーバーを生成し、クライアント上のソケットを使用して接続する方法を説明します。サーバーは詳細な処理情報をクライアントに送信します。
完全なソケットプロセスが表示されたら、それを将来のプログラム開発に使用します。サーバーは接続を可能にする HTTP サーバーであり、クライアントは Web ブラウザーです。これは単一のクライアント/サーバーの関係です。
◆ ソケットの基本
PHPは、Berkleyのソケットライブラリを使用して接続を作成します。ソケットは単なるデータ構造であることがわかります。このソケット データ構造を使用して、クライアントとサーバー間のセッションを開始します。このサーバーは常にリッスンし、新しいセッションを生成する準備をしています。クライアントがサーバーに接続すると、サーバーがセッションを待機しているポートが開きます。このとき、サーバーはクライアントの接続要求を受け入れ、サイクルを実行します。これで、クライアントはサーバーに情報を送信できるようになり、サーバーもクライアントに情報を送信できるようになります。
ソケットを生成するには、プロトコル、ソケット タイプ、パブリック プロトコル タイプの 3 つの変数が必要です。ソケットを生成するときに選択できるプロトコルは 3 つあります。詳細なプロトコルの内容については、以下を読み続けてください。
パブリック プロトコル タイプの定義は、接続に不可欠な要素です。以下の表では、一般的なプロトコルの種類を示します。
表 1: プロトコル
名前/定数の説明
AF_INET これは、送信に TCP または UDP を使用してソケットを生成するために使用されるほとんどのプロトコルであり、IPv4 アドレスで使用されます
AF_INET6 は上記と似ていますが、IPv6 で使用されますアドレス
AF_UNIX ローカル プロトコル。Unix および Linux システムで使用されます。これは、通常、クライアントとサーバーが同じマシン上にある場合に使用されます。
名前/定数の説明 SOCK_STREAM。プロトコルは、シーケンシャルで信頼性の高い、データ統合されたバイト ストリーム ベースの接続です。これは最も一般的に使用されるソケットのタイプです。このソケットは送信に TCP を使用します。
SOCK_DGRAM このプロトコルは、コネクションレス型の固定長の転送呼び出しです。このプロトコルは信頼性が低く、接続に UDP を使用します。 SOCK_SEQPACKET このプロトコルは、固定長のデータ パケットを送信して送信するデュアルラインの信頼性の高い接続です。このパッケージを読み取る前に、完全に受け入れる必要があります。
SOCK_RAW このソケット タイプは、ICMP パブリック プロトコルを使用して単一のネットワーク アクセスを提供します。 (ping とtraceroute はこのプロトコルを使用します)
SOCK_RDM このタイプはめったに使用されず、ほとんどのオペレーティング システムでは実装されていません。これはデータ リンク層に提供され、データ パケットの順序を保証しません。
表 3: パブリックプロトコル
ICMP インターネット制御メッセージプロトコル、主にゲートウェイとホストでネットワーク状態を確認し、エラーメッセージを報告するために使用されますUDP ユーザーデータメッセージプロトコル、コネクションレスで信頼性の低い送信プロトコルです
TCP 送信制御プロトコル。これは、送信プロセス中にエラーが発生した場合に、データ パケットが受信者に確実に届くようにするためのプロトコルです。
ソケットを生成する 3 つの要素がわかったので、PHP のsocket_create() 関数を使用してソケットを生成します。このsocket_create()関数には、プロトコル、ソケットタイプ、パブリックプロトコルの3つのパラメータが必要です。 socket_create() 関数は、成功した場合はソケットを含むリソース タイプを返し、失敗した場合は false を返します。
リソースソケット_create(int プロトコル, int ソケットタイプ, int commonProtocol);
コードを次のようにコピーします:
& lt ;? PHP
(注:関数紹介は原文の一部を削除しています。関数の詳しい使い方は英語の原文を参照するか、PHPのマニュアルを参照することをお勧めします)
上記の関数はすべてPHPのソケットに関するものです。これらの関数を使用するには、ソケットが開いています。まだ開いていない場合は、php.ini ファイルを編集して、次の行の前のコメントを削除してください:
extension=php_sockets.dll
コメントを削除できない場合は、次のコードを使用してコメントをロードしてください。 拡張ライブラリ:
◆ サーバーを生成します
それでは、最初の例を改良してみましょう。特定のソケットをリッスンし、ユーザー接続を処理する必要があります。
上記のサーバー側には 3 つの問題があります:
1. 複数の接続を受け入れることができません。
2. 1 つのコマンドだけで完了します。
3. Web ブラウザーからこのサーバーに接続することはできません。
この最初の問題は解決するのが簡単です
。アプリケーションを使用して毎回サーバーに接続できます。しかし、次の問題は、Web ページを使用してサーバーに接続する必要があることですが、これはさらに困難です。サーバーに接続を受け入れさせ、クライアントにデータを書き込み (書き込む必要がある場合)、接続を閉じて次の接続を待つことができます。
前のコードを改良し、次のコードを生成して新しいサーバーを作成します:
$connection =socket_accept($socket);
printf("Socket Connectedrn");
// バッファーに何かがあるかどうかを確認します
if($buffer != "")
{
printf("何かがあるバッファ内...データを送信中...rn");
socket_write($connection, $buffer . "rn");
printf("socketrn に書き込みました");
}
else
{
printf("いいえバッファ内のデータrn");
}
// 入力を取得します
while($data =socket_read($connection, 1024, PHP_NORMAL_READ))
{
$buffer = $data;
socket_write($connection, "Information Receivedrn" );
printf("バッファ: " . $buffer . "rn");
}
socket_close($connection);
printf("ソケットを閉じましたrnrn");
}
?>
◆ 2番目の問題を処理するクライアント
を生成するのは簡単です。 PHP ページを生成し、ソケットに接続し、データをそのキャッシュに送信して処理する必要があります。データを再度処理した後、データをサーバーに送信できます。別のクライアント接続では、そのデータが処理されます。 2 番目の問題を解決するには、 ソケットに接続する PHP ページを作成し、バッファー内のデータを受信し、
バッファー内のデータを処理した後、それを処理する必要があります。別のクライアントが接続すると、送信したデータが処理され、クライアントはさらにデータをサーバーに送り返します。
次の例は、ソケットの使用方法を示しています:
コードをコピーします
NO DATA
");Buffer Data: " . $buffer . “
”);ソケットへの書き込み
”);書き込み失敗
");送信されたデータ: SOME DATA
応答:” . $buffer . “
www.bkjia.com