PHPのソケット関数

不言
リリース: 2023-03-25 11:58:01
オリジナル
1783 人が閲覧しました

この記事では主に PHP のソケット関数を紹介します。これを必要な友人に共有します。

ソケットに基づいたアプリケーションを作成するには、ソケットの操作方法を理解する必要があります。詳細については、PHP の重要なソケット関数をいくつか紹介します。

1. socket_create ( int $domainint $typeint $pro tocol )

この関数はソケットを作成するには、ソケットに 3 つのパラメータがあり、戻り値はハンドル (リソース) です。

$domain は、ソケットの作成時に使用される通信プロトコル ファミリを指定します。オプションの値は次のとおりです。

  • AF_INET: IPv4 に基づくインターネット プロトコル

  • AF_INET6: ベースIPv6 インターネット プロトコル

  • AF_UNIX: Unix ローカル通信プロトコル

$ Type は、ソケット通信の対話型を指定します。 オプションの値は次のとおりです:

  • Sock_stream: シリアル化を提供します。 、信頼できる、全二重、接続ベースのバイト ストリーム送信、TCP をサポート

  • SOCK_DGRAM: データグラム スタイル、コネクションレス、固定最大長、自動アドレッシング関数送信を提供、UDP をサポート

  • SOCK_SEQPACKET: シリアル化されたデータを提供、信頼性の高いデュアルチャネル、接続ベースのデータグラム送信

  • SOCK_RAW: オリジナルのネットワークアクセスプロトコルを提供し、特別なプロトコルタイプのソケットを手動で構築でき、ICMP リクエスト (ping など) をサポートします

  • SOCK_RDM:信頼性の高いデータグラム送信を提供します。順序は保証できません

$protocol は、ICMP、UDP、TCP を含む、ソケットが使用する特定の送信プロトコルを指定します。定数 SOL_UDP は UDP に対応し、定数 SOL_TCP は一定の TCP。

2.文字列$address [, int $port = 0 ] ) この関数は、IP アドレスとこれは、socket_create によって作成されたハンドルへのポートであり、3 つのパラメーターを持ち、ブール値を返します。

$socket は必須パラメータであり、socket_create 関数によって作成されたハンドルを表します

$address は必須パラメータであり、バインドされる IP アドレスを表します

$port はオプションのパラメータで、バインドされるポート番号を表し、socket_create 関数の最初のパラメータが AF_INET の場合、このパラメータはソケット接続の監視に使用されるポートを指定します。を指定する必要があります。

3. $socket [, int $backlog = 0 ] ) この機能は監視するために使用されます接続しようとしているソケット接続。ソケットの対話タイプが SOCK_STREAM または SOCK_SEQPACKET の場合にのみ使用できます。ブール値を返します。 $socket

は必須パラメータであり、socket_create関数によって作成されたハンドルを表します(ホストにバインドされています) $backlogはオプションのパラメータで、待機中のハンドルを表しますキュー内で処理される (バックログに許可される接続の最大数。

4.

socket_set_block ( resource $socket )

この関数は、ソケット ハンドルをブロッキング モードに設定するために使用され、Boo を返します。痩せた価値。ノンブロッキング モードのソケットをブロッキング モードに変換できます。

ブロッキング モードのソケットで操作 (受信、送信、接続、受け入れなど) を実行すると、スクリプトはシグナルを受信するか操作が完了するまで実行を一時停止します。

$socket は必須パラメータであり、有効なソケット ハンドル (socket_create またはソケット_accept によって作成される) を表します。 ブロッキング モードと非ブロッキング モードの違いを簡単に紹介します:

ノンブロッキングとは、結果がすぐに得られなくなるまで関数操作が現在のスレッドをブロックせず、ただちに戻ることを意味します。ブロックとは、作業が完了するまで戻ることができないことを意味します。次のステップに進む前に、相手からの応答を得る必要があります。特にユーザー数が多い場合はノンブロッキングに設定する必要があります。ブロッキング モードの場合、2 つのクライアントが同時に接続されている場合、サーバーが 1 つのクライアントのリクエストを処理しているときに、他のクライアントのリクエストは前のクライアントの処理が完了した後でのみブロックされ、後のクライアントのリクエストが処理されます。に応じられます。 [ ,

int

$length = 0 ] ) この関数は、指定されたサイズのバッファ データをソケットに書き込むために使用され、3 つのパラメーターがあり、書き込まれたデータのバイト数を返します。 $socket は必須パラメータであり、有効なソケット ハンドルを表します。 $buffer は必須パラメータであり、書き込まれる文字列データを指定します。 $length は、ソケットに順番に書き込まれるデータのバイト数を指定するオプションのパラメータです。その値が $buffer のバイト数よりも大きい場合、サイレントにインターセプトします。それをバイト単位の $buffer の長さにします。


6.
,

int $length [, int $type] = PHP_BINARY_READ ] )

この関数はソケットから指定されたバイト長のデータを読み取るために使用され、3 つのパラメータがあり、読み取った文字列データを返します。

$socket は必須パラメータであり、有効なソケット ハンドルを表します。
$length は必須パラメータであり、読み取られるバイトの長さを指定します。

$type はオプションのパラメータで、デフォルト値は PHP_BINARY_READ で、バイナリ データの安全な読み取りを意味します。別のオプションの値は PHP_NORMAL_READ で、 r または n が見つかった場合は読み取りを停止することを意味します。

7. pfsockopen(string $hostname[, int $port = -1[, int &$errno[, 文字列 &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

この関数は、永続的なソケット接続、つまり長い接続を実装するために使用され、次の値を返します。ハンドル。 fsockopen との違いは、pfsockopen によって確立された接続はスクリプトの実行後に切断されないことです。

8. socket_set_option (resource$socketint$levelint$optname) mixed$optval)

この関数はソケット制御オプションを設定するために使用され、4 つのパラメーターがあり、ブール値を返します。

$socket は必須パラメータであり、有効なソケット ハンドルを表します。

$level は、オプションが有効になるプロトコル レベルを指定する必須パラメータです。通常、定数 SOL_SOCKET を受け取ります。

$optname は必須パラメータであり、制御するオプションの名前を指定します。

$optval は必須パラメータであり、オプションの値を指定します。

9.socket_last_error ([resource$socket ] )

この関数は、ソケット関数によって生成された最後のエラー コードを取得するために使用され、戻り値は整数です。 10. (int $errno

)

この関数は、エラーコードで表されるエラーの説明を取得するために使用されます、戻り値は文字列です。 低レベルのプログラマではない場合、ソケットの内部実装メカニズムを深く理解することは非常に困難です。ソケットはプロセス通信を実装するためにオペレーティング システムによってカプセル化された関数のセットであることを理解するだけで十分です。を作成して呼び出します。 PHP の言語特性と位置付けにより、PHP はソケット サーバーではなくソケット クライアントにのみ適していると判断されます。 ソケットは主に最下層とネットワークサービスの開発を指向しているため、サーバー側は一般にCやJavaなどの言語で実装されます。これにより最下層をより適切に操作でき、ネットワークで発生する問題の解決にも成熟しています。サービス開発 (同時実行性、ブロッキングなど) 完璧なソリューションですが、PHP は明らかにこのアプリケーション シナリオには適していません。 実際、PHP はソケットを通じて MySQL データベースを操作します。これはまさに、ソケットが基礎となるプロトコルを保護し、ネットワーク サービス間の相互接続をシンプルにするためです。 HTML5 の普及に伴い、従来のサーバーサイド言語で実装されたソケットに加えて、ブラウザクライアントで実装された WebSocket も徐々に登場しており、これも注目に値します。 クライアント上でソケットを操作するには、fsockopen、socket_create、またはstream_socket_clientなどの関数を使用できます。PHP5の場合は、stream_socket_clientを使用することを推奨します。

ソケット対話型アプリケーションの例: ソケットを使用してフォームを送信

新しいテストを作成する.php ファイル、フォーム データを

http://demo.com/index.php?id=1 に送信します。コードは次のとおりです

[php] view plain copy
<?php  
$data = array(&#39;comment&#39;=>&#39;this is a robot comment&#39;);  
$data = http_build_query($data);  
$out = "POST http://demo.com/index.php?id=1 HTTP/1.1\r\n";  // 通过POST方式发送数据  
$out .= "Host: demo.com\r\n";  
$out .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n";  
$out .= "Content-length: ".strlen($data)."\r\n";  
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0"."\r\n";  
$out .= "Connection: close"."\r\n"."\r\n";    // 注意:此处有两个 \r\n
$out .= $data."\r\n";   // 正文数据
$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);  // 创建socket客户端连接
// $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);  推荐这种写法
fwrite($fp, $out);    // 向服务器发送数据
while (!feof($fp)) {  
    echo fgets($fp, 1280);    // 读取服务器响应的数据
}  
fclose($fp);  // 关闭socket连接
?>
ログイン後にコピー

次の点に注意する必要があります:

  • fsockopen的第一个参数,也可以使用IP地址,不要带 http:// 字符串,除非使用SSL等

  • 请求头(headers)不一定要带上所有的头域,一般只需带上几个核心的header即可

  • 在最后一个header处,即 Connection 后有两个换行

  • 注意编码问题

如果是PHP5,建议使用 stream_socket_client 代替 fsockopen,也就是将下面的代码:

$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);
ログイン後にコピー

改为:

$fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);
ログイン後にコピー

在PHP中,99.9%的socket应用属于流套接字的范畴,由于数据包套接字和原始套接字涉及比较底层的协议知识,这里就不作深究,有兴趣的朋友可自行学习。

相关推荐:

PHP中PDO事务处理操作示例


以上がPHPのソケット関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!