PHP+SocketシリーズのIO多重化とWebサーバーの実装
この記事では、php ソケットに関する関連知識を提供します。主に IO 多重化と、php ソケットが Web サーバーを実装する方法を紹介します。興味のある方は以下をご覧ください。皆様のお役に立てれば幸いです。
多重化
## 前の記事シンプルなサーバー -クライアント通信はネイティブ ソケットを介して実装されますが、複数のクライアントが接続されている場合、サーバーは最初のクライアントのリクエストのみを処理でき、後続のクライアントにはサービスを提供できません
この理由IO モデルがブロックされており、同時に 1 つのクライアントしかアクセスできないという状況です。この問題を解決するには、主に 2 つの解決策があります:
- 複数のプロセス、つまり複数のプロセスは、
- IO 多重化メカニズムを監視するためにサーバー上で開始されます。これは、単純に N 個のクライアントの使用を実装します。 1 本のネットワーク ケーブルが、
- と に同時にアクセスします。多重化は、
と epoll
という 2 つの異なるモデルに分けられます。ソフトウェアでは、Apache
は select
モデルを使用し、nginx
は epoll
モデルを使用します。 select
モデルは php に組み込まれており、対応する関数は socket_select
です。多重化は http サーバーを実装するための基礎です。Syntax
前の記事で、PHP のネイティブ ソケットには
select モデルを実装する組み込みの socket_select
関数があることを紹介しました。その構文は次のとおりです: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">socket_select(
array &$read,
array &$write,
array &$except,
int $seconds [,
int $microseconds = 0]): int|false</pre><div class="contentsignin">ログイン後にコピー</div></div>
Parameters
- read
socket_selectサーバーによって監視されるソケット リソース (つまり、新しいメッセージが受信されたとき、またはクライアントが変更されたとき)接続または切断されています)、
関数は戻ります (そうでない場合はブロックを続けます)、同時に変数を現在のイベント (受信したメッセージまたはクライアント接続、または切断)、下方向に実行を続けます。
- write
null#データを書き込んでいるクライアントがあるかどうかを監視します。
を渡すことは、データを書き込んでいないことを意味します。書き込み変更があるかどうかに注意してください。
- Except
nullソケット内で除外される要素。
を渡します。すべてを「リッスン」しています
- 秒
null秒とマイクロ秒を合わせてタイムアウト パラメータを形成します。
を渡すとブロック、0 を渡すとノンブロッキング、>0 を渡すと最大ブロック時間
- マイクロ秒
#前回の記事
では、ソケットのサーバー側監視接続を実装しただけです。次に、サーバー側の監視コードの基礎を構築します。多重化を通じてコードを最適化します:<?php // 创建套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 设置 ip 被释放后立即可使用 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true); // 绑定ip与端口 socket_bind($socket, 0, 8888); // 开始监听 socket_listen($socket); $sockets[] = $socket; while (true) { $tmp_sockets = $sockets; socket_select($tmp_sockets, $write, $except, null); foreach ($tmp_sockets as $sock) { // 如果当前套接字等于 socket_create 创建的套接字,说明是有新的连接或有新的断开连接 if ($sock == $socket) { $conn_sock = socket_accept($socket); $sockets[] = $conn_sock; socket_getpeername($conn_sock, $ip, $port); echo '请求ip: ' . $ip . '端口: ' . $port . PHP_EOL; } else { // 否则说明是之前连接的客户端发来消息 $msg = socket_read($sock, 10240); socket_write($sock, strtoupper($msg)); echo $msg; } } }
$tmp_sockets ソケット リソースが新しい場合、クライアントが接続または切断するか、新しいメッセージを受信すると、
$tmp_sockets 配列を現在アクティブなソケット リソースに変更します。次に、配列を走査してビジネス ロジックを処理します
ソケットを使用して単純な http サーバーを実装します
http プロトコルは指定されたデータを指定します形式はソケットに基づいているため、必要なのは socket_write
形式に従ってデータを送信すると、ブラウザは通常どおりリクエストに応答できます<?php // 创建套接字 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 设置 ip 被释放后立即可使用 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true); // 绑定ip与端口 socket_bind($socket, 0, 8888); // 开始监听 socket_listen($socket); $sockets[] = $socket; while (true) { $tmp_sockets = $sockets; socket_select($tmp_sockets, $write, $except, null); foreach ($tmp_sockets as $sock) { if ($sock == $socket) { $conn_sock = socket_accept($socket); $sockets[] = $conn_sock; } else { $msg = socket_read($sock, 10240); var_dump($msg); if ($msg == '') return; $output = '<h1 id="this-nbsp-is-nbsp-php-nbsp-worker">this is php worker</h1>'; $len = strlen($output); $response = "HTTP/1.1 200 OK\r\n"; $response .= "content-type: text/html\r\n"; $response .= "server: php socket\r\n"; $response .= "Content-Length: {$len}\r\n\r\n"; $response .= $output; socket_write($sock, $response); } } }
この例をサーバー上で実行し、アクセスします
ip:8888 をブラウザに表示すると、次の内容が表示されます:
同時に、サーバーは次の内容を出力します:
GET / HTTP/1.1 Host: 124.222.**.**:8888 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: jenkins-timestamper-offset=-28800000; _ga=GA1.1.1403944751.1652010033; _ga_2GM6102E19=GS1.1.1652802985.7.1.1652803014.0
file_get_content
を使用するなどの要求に従って応答できます。指定されたファイルのコンテンツを読み取り、ブラウザーに返します。推奨学習: 「
」 ##
以上がPHP+SocketシリーズのIO多重化とWebサーバーの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
