この記事で共有する内容は、PHP でのシステム プログラミングのネットワーク ソケットと IO の多重化に関するものです。必要な方は参考にしてください。
長い間、PHP はほとんど使用されていませんでした。結局のところ、プログラミングはスクリプト言語であり、効率が大きなネックになります。ただし、PHP がソケット プログラミングに使用できないとは言えませんし、PHP のソケット プログラミングのパフォーマンスがそれほど低いとも言えません。たとえば、有名な PHP ソケット フレームワーク Workerman は純粋な PHP で開発されており、優れたパフォーマンスを誇るため、環境によっては PHP ソケット プログラミングのスキルを発揮できる場合もあります。
PHP は、C 言語ソケット ライブラリにあるものと同様の一連のメソッドを提供しており、これを呼び出すことができます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
詳細については、ソケットに関する PHP 公式マニュアルを確認してください: http ://php .net/manual/zh/book.sockets.php
単純な TCP サーバーの例 phptcpserver.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
このサーバーを起動します:
1 |
|
その後、サーバーはそこでブロックされ、クライアントが接続するのを待ちます:
1 2 3 4 5 6 7 8 9 10 |
|
サーバーの出力:
1 2 3 4 5 |
|
しかし、実際には、この TCP サーバーは一度に 1 つのクライアントの接続とデータ送信しか処理できないためです。接続すると、プロセスはクライアントの読み取りと書き込みを担当します。クライアントがデータを送信しない場合、TCP サーバーは読み取りブロック状態になり、他のクライアントからの接続要求を処理できなくなります。
この問題を解決する 1 つの方法は、クライアントが接続するたびに、サーバーはクライアントとのデータ送信を担当する子プロセスを開き、親プロセスは引き続きそのプロセスを監視します。しかし、このマルチプロセス メカニズムでは、明らかに高い同時実行性をサポートできません。
もう 1 つの解決策は、IO 多重化メカニズムを使用し、PHP が提供するsocket_select メソッドを使用することです。これは、複数のソケットのステータスが、書き込み不可から書き込み可能に、書き込み不可から読み取り不可になど変化した場合に監視できます。読み取り可能である場合、このメソッドは返されるため、ソケットの処理、クライアント接続の処理、読み取りおよび書き込み操作などが可能になります。 PHPドキュメントでsocket_selectの紹介を見てみましょう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
大まかに翻訳すると:
socket_select --- 指定されたソケット配列のセットに対してselect()システムコールを実行します。特定のタイムアウト。
socket_select() は、いくつかのソケット配列をパラメーターとして受け入れ、状態の変更をリッスンします
これらの BSD スコケットは、これらのソケット リソース配列が実際にはファイル記述子のコレクションであることを認識する機能に基づいています。
3 つの異なるソケット リソース配列が同時に監視されます。
これら 3 つのリソース配列は必須ではありません。関数が返された後、これらの配列の値が参照によって渡されることを忘れないでください。変化すること。
socket_select() は、これら 3 つの配列でステータスが変更されたソケットの合計数を正常に返します。タイムアウトが設定されており、タイムアウト内にステータスの変更がない場合、この関数は 0 を返します。エラーが発生した場合は、この関数は 0 を返します。 FALSE を返します。socket_last_error() を使用してエラー コードを取得します。 T phptcpserver.php コードの前に、socket_select() を使用して最適化します:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
|
これで、この TCP サーバーは複数のクライアントの同時接続をサポートできるようになります。 テスト:
サーバー側:
1 2 3 4 5 6 7 8 9 10 11 |
|
上記のサーバーの戻り値を少し変更して、HTTP 応答ヘッダーと単純な HTTP 応答本文を返し、最も単純な HTTP サーバーに変換します:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
サーバーを再起動し、curl を使用して http サーバーのリクエストをシミュレートします:
1 2 3 4 5 6 7 8 9 10 11 |
|
このような同時実行性の高い HTTP サーバーが開発されました。ストレス テスト ソフトウェアを使用して同時実行機能をテストします。
5,000 QPS を超えることに少し興奮していますか?^^。
PHP は世界で最高の言語です、それだけです!
以上がPHPはシステムプログラミングのネットワークソケットとIOの多重化を実現しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。