この記事では、子プロセスに配布するために swoole マスタープロセスにリクエストする fastcgi など、swoole に関する関連知識を提供しますが、使用後に終了する php-fpm 子プロセスやその他の関連問題とは異なります。助けなければなりません。
#推奨学習:#- ユーザーの http インターフェイスへのログインが承認されています
# -許可されたリクエスト http インターフェース
# # を通じて、友達リスト、さまざまな友達の最後の未読メッセージ、および未読メッセージの数 (ホームページ表示用) を取得します。 ##- 承認リクエストを通じてグループ リストを取得します (ストレージ スペースを節約するために、グループ メッセージは既読または未読になりません)
- ws を作成しますlink
- 切断と再接続のメカニズムを登録します。close イベントがトリガーされると、ws# # が再接続されます。
#- ping タイマーを設定し、30 秒ごとに ping を送信します
## - ws インターフェイスを通じて、すべての未読メッセージが取得され、クライアントによって処理され、通知バーなどにプッシュされます。
##-新しいメッセージのプッシュを受信し、メッセージ リストに表示します。
#- グループ/友達のメッセージ インターフェイスをクリックすると、自動的に最新の n 個のメッセージを取得すると、ユーザーはプルアップ時に引き続き n 個のメッセージを取得します
## 実行モード操作#cgi プロトコル モード
プログラムを呼び出す/プログラムを実行 -> プログラムがコンテンツを返す/プログラムの呼び出しが終了 -> Web サーバーがコンテンツを受信 -> ユーザーに戻る
ユーザーリクエストごとにフォークしてプロセスを作成する必要があるため、プログラムを一度呼び出してからプロセスを破棄するため、パフォーマンスが低下します
#fast-cgi プロトコル モード
##fast-cgi は、cgi モードのアップグレード バージョンです。 like 常駐 CGI です。オンになっている限り、プロセスを終了することなく常にリクエストを処理できます。呼び出し原理は大まかに次のとおりです。
ユーザー リクエスト - > Web サーバーがリクエストを受信 - > fast-cgi プロセス マネージャーに渡す - > fast-cgi プロセス管理領域がリクエストを受信し、いずれかのプロセスに渡すfree fast-cgi プロセスの処理 -> 処理が完了し、fast-cgi プロセスはアイドル状態になり、次のリクエストを待機します -> Web サーバーがコンテンツを受信します -> ユーザーに戻りますモジュール モード
Apache php が実行されているとき、モジュールモードはデフォルトで使用され、php を Apache として使用します。モジュールは、Apache の開始時に開始されます。ユーザーリクエストが受信されると、mod_php モジュールを呼び出して直接処理されます。詳細は、Baidu で確認できます。
##php-cli モードはコマンド ライン モードに属します。これは、PHP の学習を開始し、wamp と wnmp を始めたばかりの多くの開発者に最適です。馴染みのない操作モード
このモードでは、他のモードを使用する必要はありません。プログラムの場合、php xx.php と直接入力して php コードを実行できます
コマンド ライン モードは、次の場合に通常の Web モードとは明らかに異なります。
#* STDIN および STDOUT の標準入出力/エラーの使用
#* echo var_dump、phpinfo などの出力が直接出力されます。 コンソールに移動します。
* 使用できるクラス/関数が異なります
#* php.ini 設定の違い
php-fpm
ファイル アップロードの最適化サポート;
「スロー ログ」 - スクリプトを記録します (ファイル名を記録するだけでなく、PHP バックトレース情報も記録します。ptrace または同様のツールを使用して、実行中のログを読み取り、分析できます)リモート プロセスのデータ) 実行による異常な遅さ;
fastcgi_finish_request() - 特別な関数: リクエストが完了した後、バックグラウンドで時間のかかる作業 (ビデオ入力変換、統計処理など) を実行し続けるために使用されます。データが更新されます;
動的/静的サブプロセスの生成;
基本的な SAPI 実行ステータス情報 (Apache の mod_status と同様);
php.ini に基づく設定ファイル。
動作原理:
ネットワーク プロトコル
ネットワーク プロトコルはルールですコンピュータ ネットワークでのデータ交換のために確立された標準、または一連の協定。コンピュータ/携帯電話と他のネットワーク デバイス間のすべての通信は、ネットワーク プロトコルに準拠する必要があります。ネットワークプロトコルは通信の段階に応じて7つのレベルに分かれており、上から
##アプリケーション層
IP プロトコルはインターネットの基本プロトコルであり、現在最も人気のあるネットワーク プロトコルです
##このプロトコルはホスト間プロトコルによって呼び出され、ローカル ネットワーク プロトコルを呼び出してデータ パケットを次のゲートウェイまたは宛先ホストに送信する役割を果たします。たとえば、TCP は IP プロトコルを呼び出し、呼び出し時に宛先アドレスと送信元アドレスをパラメーターとして渡します。IP はデータ パケットを形成し、ローカル ネットワーク (プロトコル) インターフェイスを呼び出してデータ パケットを送信します。
IP は、サービス タイプ、存続時間、オプション、ヘッダー チェック コードという 4 つの主要なテクノロジーを使用してサービスを提供します。サービスの種類とは、期待されるサービスの品質を指します。サービス タイプは、インターネットが提供できるサービスを表すパラメータのセットです。このサービス タイプは、特定のネットワーク上、通過する次のネットワーク上、またはこのパケットをルーティングする次のゲートウェイ上の実際の配信パラメータを選択するためにゲートウェイによって使用されます。生存時間は、パケットが存続できる期間の上限です。これは送信者によって設定され、ルートによって処理されます。到着しないときに存続時間がゼロの場合は、パケットを破棄します。このオプションは制御機能にとって重要ですが、通常の通信にはその存在は必要ありません。オプションには、タイムスタンプ、セキュリティ、特別なルーティングが含まれます。ヘッダー チェック コードにより、データの正しい送信が保証されます。チェックが失敗した場合、パケット全体が破棄されます。 ###########################IPアドレス#####################
TCP (伝送制御プロトコル) 接続ですIETF の RFC 793 によって定義された、信頼性の高いバイト ストリーム ベースのトランスポート層通信プロトコル。簡略化されたコンピュータ ネットワーク OSI モデルでは、第 4 層のトランスポート層で指定された機能を実現します。ユーザー データグラム プロトコル (UDP) は、同じ層内のもう 1 つの重要なトランスポート プロトコルです。インターネット プロトコル スイートにおいて、TCP 層は、IP 層の上、アプリケーション層の下に位置する中間層です。多くの場合、異なるホストのアプリケーション層間には信頼性の高いパイプのような接続が必要ですが、IP 層はそのようなフロー メカニズムを提供せず、信頼性の低いパケット スイッチングを提供します。 #アプリケーション層は、ネットワーク間送信用の 8 ビット バイトで表されるデータ ストリームを TCP 層に送信し、次に TCP 層に送信します。データ ストリームは、適切な長さのセグメントに分割されます (通常、コンピュータが接続されているネットワークのデータ リンク層の最大伝送単位 (MTU) によって制限されます)。次に、TCP は結果のパケットを IP 層に渡し、IP 層はそのパケットをネットワーク経由で受信エンティティの TCP 層に配信します。 TCP では、パケット損失が発生しないように各パケットにシーケンス番号を付与すると同時に、受信側エンティティに送信されたパケットが順番に受信されることを保証します。次に、受信側エンティティは、正常に受信されたパケットに対する対応する確認応答 (ACK) を送り返します。送信側エンティティが妥当な往復遅延 (RTT) 以内に確認応答を受信しない場合は、対応するデータ パケットが受信されたものとみなされます。再送信されます。 TCP では、チェックサム機能を使用してデータにエラーがないかどうかをチェックし、送信時と受信時にチェックサムを計算します。 ##TCP は、インターネットのトランスポート層プロトコルであり、3 ウェイ ハンドシェイク プロトコルを使用して接続を確立します。アクティブなパーティが SYN 接続要求を送信すると、相手が SYN ACK で応答するのを待ち、最後に相手の SYN に対して ACK 確認を実行します。この接続方法により誤接続を防ぐことができ、TCP で使用されるフロー制御プロトコルは可変サイズのスライディング ウィンドウ プロトコルです。 TCP 3 ウェイ ハンドシェイクのプロセスは次のとおりです。
接続が成功すると、双方が相互にバイト ストリームを送信できるようになり、いつでも接続を閉じることができます。送信されるデータには次の特性があります。
接続の確立には 3 回のハンドシェイクが必要で、接続の終了には 4 回のウェーブが必要ですが、これは TCP のハーフクローズが原因です。具体的なプロセスは以下の通りです。
ユーザーがブラウザに を入力します
www.easyswoole.com DNS サーバー分析/またはローカル ホスト、ルーター ホストの比較による IP
ブラウザがデフォルトのポート 80 にアクセスする場合、アクセスされる TCP アドレスは ip:80 です。
tcp プロトコル 3 ウェイ ハンドシェイクによる接続確立
http リクエスト リクエスト ヘッダーを送信する
サーバーは、アクセスが http アクセスであることを示す http リクエスト リクエスト ヘッダーを取得し、http リクエスト ヘッダーを解析して、リクエスト タイプ、リクエスト フォーマット、およびリクエスト データを取得します。 (Cookie、データの取得、投稿)
サーバーは応答応答データを送信し、積極的に切断します
ブラウザは応答データを受信し、応答テキスト タイプを解析し、データを解析して切断します。
https プロトコルでは、リクエストと応答に tls および ssl の暗号化および復号化プロトコルの追加レイヤーがあり、デフォルトのポートが 80 から 443 に変更されました。
phper の この状況のため、WebSocket が登場しました。維持するために必要なのは 1 回の http ハンドシェイクだけです。長い接続により、サーバーは次のことを行うことができます。メッセージをクライアントに積極的に送信し、ポーリング メカニズムの消費を大幅に削減します
サーバー プッシュ: サーバー プッシュ。サーバーは、データを返す前にブラウザーのリクエストを受動的に受信するのではなく、新しいデータがあるときにブラウザーにアクティブにプッシュします。 udp(トランスポート層)
UDP は User Datagram Protocol の略称です。中国語名は User Datagram Protocol です。OSI (Open System Interconnection) 参照モデルのコネクションレス型トランスポート層プロトコルであり、シンプルで信頼性の低いトランザクション指向のメッセージ転送サービスを提供します。 IETF RFC 768 は UDP の正式な仕様です。 IP パケットの UDP のプロトコル番号は 17 です。 UDP プロトコルの正式名は User Datagram Protocol で、ネットワーク内で TCP プロトコルと同様にデータ パケットを処理するために使用されます。 . コネクションレス型プロトコルです。 OSI モデルでは、4 番目の層であるトランスポート層が IP プロトコルの上位層になります。 UDP には、データ パケットのグループ化、アセンブリが提供されておらず、データ パケットの並べ替えができないという欠点があります。つまり、メッセージが送信された後、メッセージが安全かつ完全に到着したかどうかを知ることが不可能です。 UDP は、コンピュータ間でデータを送信する必要があるネットワーク アプリケーションをサポートするために使用されます。ネットワーク ビデオ会議システムを含む多くのクライアント/サーバー ネットワーク アプリケーションでは、UDP プロトコルの使用が必要です。 UDP プロトコルは、その誕生以来長年にわたって使用されており、その初期の栄光はいくつかの同様のプロトコルによって影が薄くなりましたが、今日でも非常に実用的で実現可能なネットワーク トランスポート層プロトコルです。 よく知られている TCP (伝送制御プロトコル) プロトコルと同様、UDP プロトコルは IP (インターネット プロトコル) プロトコルのすぐ上にあります。 OSI (Open Systems Interconnection) 参照モデルによれば、UDP と TCP は両方ともトランスポート層プロトコルです。 UDP プロトコルの主な機能は、ネットワーク データ トラフィックをデータ パケットに圧縮することです。一般的なデータ パケットは、バイナリ データの送信単位です。各データ パケットの最初の 8 バイトはヘッダー情報を含めるために使用され、残りのバイトは特定の送信データを含めるために使用されます。 udp と tcp は両方ともトランスポート層プロトコルに属し、ip プロトコルの最上位層に位置します。それらの違いは次のとおりです: #udp はコネクションレス型プロトコルであり、TCP ハンドシェイクを必要としません
udp が一度に送信する最大長は 65535 ですが、tcp はハンドシェイク後に継続的に送信できます
#udp プロトコルは、ヘッダー内のチェック値を使用してデータのセキュリティを確保します。チェック値は、データ送信側で特別なアルゴリズムによって最初に計算され、受信側に渡された後に再計算する必要があります。データグラムが送信中に第三者によって改ざんされたり、回線ノイズなどによりデータグラムが破損した場合、送信側と受信側のチェックサム計算が一致しないため、UDP プロトコルはエラーがあるかどうかを検出できます。これは、チェック値を必要とする TCP プロトコルとは異なります。
Udp メッセージには信頼性保証、順序保証、フロー制御フィールドなどが無く、信頼性が低いです。しかし、UDPプロトコルは制御オプションが少ないからこそ、データ伝送時の遅延が少なく、データ伝送効率が高く、高い信頼性を必要としないアプリケーションや、DNSなどの信頼性を保証できるアプリケーションに適しています。 、TFTP、およびSNMP。お待ちください。
#ネットワーク品質が非常に悪い環境では、UDP プロトコルのパケット損失がより深刻になります。 TCP は、相手が正常に受信したことを確認するために確認検証を実行します。
上で述べたphp-fpmです。 fast-cgi のプロセス マネージャー。起動後、複数の fast-cgi プロセスが起動され、タスクの処理を待ちます。 php-fpm ソフトウェア レベルでは、fast-cgi の複数のプロセスこれはマルチプロセス処理に属しますが、ユーザーがリクエストを開始し、 # が処理のために nginx によって php-fpm に渡されると、この時点で各リクエストは、実際にはロジック処理用の php fast-cgi プロセスのみを占有します。ビジネス ロジックを実行する php プロセスは、実際には単一のプロセスです。 同様に、php ファイルを直接実行する場合、デフォルトでは、php コードを実行するために 1 つの php プロセスのみが開かれます 従来の Web モードでは、PHP は常に単一プロセスでビジネス ロジックを処理していました。 PHP - cli モードでは、非同期タスクを処理するために使用されます。ネットワーク サーバーとして機能する場合、マルチプロセス処理が可能です。そのため、ほとんどの PHP 使用者は、php マルチプロセスの概念に慣れていません #Linux メッセージ キューを使用したメッセージ キュー通信は、sysvmsg 拡張機能を介して表示できます。 プロセス信号通信を表示できます: 共有メモリ通信は、他のプロセスがアクセスできるメモリのセクションをマップします。この共有メモリは 1 つのプロセスによって作成されますが、複数のプロセスによってアクセスできます。
#共有メモリは最速の IPC 方式であり、他のプロセス間通信方式の動作効率の低さを考慮して特別に設計されています。
#プロセス間の同期と通信を実現するために、シグナルなどの他の通信メカニズムと組み合わせて使用されることがよくあります。
ソケット通信
サードパーティ通信は、ファイル操作、mysql、redis、その他の方法を使用して実現することもできます プログラムには複数のコルーチンを含めることができ、複数のスレッドを含むプロセスと比較できるため、以下でコルーチンとスレッドを比較してみましょう。 複数のスレッドは比較的独立しており、独自のコンテキストを持ち、切り替えはシステムによって制御され、コルーチンも比較的独立していることがわかっています。 独自のコンテキストがありますが、その切り替えはそれ自体で制御され、現在のコルーチンから他のコルーチンへの切り替えは現在のコルーチンによって制御されます。
#コルーチンとプロセス コルーチン実行シーケンス から、簡単に次のようになります。コルーチンは実際にはプロセス内で実行されている単なる関数であることがわかりましたが、この関数はいわば次の実行に切り替わります: コルーチンはプロセス内で実行される単なる一連のタスク コードですが、これらのタスク コードはクロスワイズで実行できます。コルーチンは並列マルチタスクではなく、直列マルチタスクであることに注意してください。各プロセスは一度に 1 つのタスクのみを実行します コルーチンのスコープ I になります。コルーチン /O 接続内 のコード 2 を使用して、task1 関数と task2 関数が mysql を共有する場合を説明します。このとき、コルーチンは交差して実行されるため、タスク 1 とタスク 2 がクエリしたデータをタスク 1 が取得したり、データの一部が失われタスク 2 が取得したりする可能性があります。 ##コルーチンのクロス実行メカニズムにより、各コルーチンの I/O 接続は独立している必要があるため、各コルーチンで接続を作成する必要がありますが、 mysql と redis の接続数は限られており、接続の開閉には多くのリソースが消費されるため、接続プール ソリューションを使用して共有接続を実現できます (各接続で一度に 1 つのコルーチンのみが使用される場合に限ります)。 推奨学習: swoole チュートリアルtcp (伝送層)
#スリーウェイ ハンドシェイク
#接続に成功しました
#送信されたデータは、tcpによって送信に最適なデータブロックに分割され、ipプロトコルに渡されます。この送信データは、メッセージセグメントまたはセグメントと呼ばれます
#4 回手を振ります
「通常」とは、ステップ 1 の FIN がデータと一緒に送信される場合があることを意味します。また、ステップ 2 と 3 で送信されるセグメントも送信されます。パッシブシャットダウンを行う側からは両方をセクションにマージすることが可能です。手順 2 と 3 の間では、パッシブ シャットダウンを実行する側からアクティブ シャットダウンを実行する側にデータを流すことができます (これを「ハーフ クローズ」と呼びます)。 Unix プロセスが自発的 (exit の呼び出しまたはメイン関数からの戻り) または非自発的 (プロセスを終了するシグナルの受信) で終了すると、開いている記述子はすべて閉じられ、その結果 TCP が開いたままになります。FIN も発行されます。接続。クライアントまたはサーバーのいずれかがアクティブ シャットダウンを実行できます。通常、クライアントはアクティブ シャットダウンを実行しますが、HTTP/1.0 などの一部のプロトコルでは、サーバーがアクティブ シャットダウンを実行します。 tcp の
#phpphp には、次の方法でアクセスできます。ソケット関数、swoole 拡張機能、ストリーム フロー関数は、tcp プロトコルのソケットを作成し、ネットワーク カード ポートをバインドし、tcp サーバー/クライアントの操作を実行します。php では、tcp ハンドシェイク/ウェービングを知る必要はありません。 ip:port を知っている TCP サーバー/クライアントに接続/作成できることだけです
PHP のソケットを使用すると、文字列を直接送信したり、文字列を受信したりできます。その他はすべて言語とオペレーティング システムが行う必要があることです。 文字列の整合性を処理するだけで済みます。たとえば、tcp サーバーとして php を使用します
クライアントが正常に接続すると、 「easyswoole は非常に優れた swoole フレームワークです」文字列
# #プロセス分析
##http リクエストのプロセスは大まかに次のとおりです。
#http
によるほとんどの場合、PHP は Web サーバーに使用されるため、PHP 開発者が最もよく使用するプロトコルは、TCP/IP プロトコルに基づく HTTP プロトコルです。 HTTP プロトコルについては理解している必要がありますが、ブラウザの f12->ネットワークを使用して、http プロトコルの特定の要求ヘッダーとサーバーによって送信された応答ヘッダーを表示できます
WebSocket プロトコル#### #############################背景################ ##WebSocket プロトコルが存在する前は、Web ページにチャット ルームを実装する唯一の方法は、ajax を使用して、サーバーにデータが生成されているかどうかを継続的にポーリングおよびリクエストすることでした。
ポーリング間隔が短すぎる場合、クライアントとサーバーは http を実行し続けます。一定期間内の TCP ハンドシェイク。/手を振る動き、http リクエスト ヘッダーとレスポンス ヘッダーの送信は、多くのサーバー リソースを消費します。ユーザーの数が多い場合、サーバーはビジー状態になり、場合によってはダウンします。
#クライアントは、毎回 http リクエストを送信することでサーバーに返すデータがあるかどうかを取得することしかできず、データの適時性は保証できません
。 WebSocket API では、ブラウザとサーバーはハンドシェイク アクションを実行するだけで、ブラウザとサーバーの間に高速チャネルが形成されます。 両者は相互にデータを直接送信できます。この WebSocket プロトコルでは、リアルタイム サービスを実現するために 2 つの大きな利点がもたらされます:
ヘッダー: 相互に通信するヘッダーは非常に小さい -約 2 バイト
udp と tcp
PHP マルチ-プロセス
マルチプロセスの概念 前にも述べたように、マルチプロセスは主にビジネスロジックレベルの開発を行い、複数のタスクを並行して処理するために使用されます ビジネスロジックレベルの開発とは何ですか?
詳細 プロセス開発シナリオ
##pcntl 拡張機能を使用する
##プロセス通信
パイプ通信は名前付きパイプ、名前なしパイプなどに分かれています。詳細は自分で検索できます
Coroutine#コルーチンはプロセスやスレッドではなく、その実行プロセスはサブルーチン、つまり戻り値のない関数呼び出しに似ています。 上記のコード 2
コルーチンプロセス内にあるタスク コードの文字列なので、そのグローバル変数、静的変数、およびその他の変数は、php のグローバル バッファーを含めてすべて共有されます。コルーチン内のグローバル変数、静的変数、1 つのコルーチンが変更される限り、すべてのコルーチンに影響します。ob バッファー関数を使用してインターセプトする場合は、他のコルーチンの出力によって汚染されるかどうかも考慮する必要があります。 使用 コルーチン実行シーケンス コード 2 は、task1 が $_GET['name'] に値 1 を割り当てると、task2 が $_GET['name'] を読み取って、それも 1 になることを説明しています。 task2 $_GET['name'] に値 2 が割り当てられると、task3 は $_GET['name'] を読み取り、これも 2
##コルーチンでは、I/O 接続を共有しないように特別な注意を払う必要があります。 コルーチン実行シーケンス
以上がswooleの知識ポイントを詳細に整理(要約共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。