長いリンクについて言えば、リンクを再利用してデータを継続的に操作することはよく知られていますが、これはリンクを頻繁に開いたり閉じたりする必要があるような一夜限りのサービスではなく、非効率的です。ビジネスの複雑さが増します。多くのインターネット ビジネス シナリオでは、ゲーム、チャット、情報プッシュなど、長時間接続のサポートが必要です。今日は、PHP 長時間接続の秘密を段階的に明らかにします。どのようなテクノロジーも導入にはビジネスシーンのニーズがあると思いますので、今回はチャットルームについてもお話します。
0x00 まずはマスターになってみよう
PHP でチャット ルームを作成していたとき、まだポーリングを使用していたことを思い出します。ポーリングについて言及すると、間違いなくロング ポーリングと言う人がいることは間違いありません。ロングポーリングも非常に優れていますが、nginx + fpm でこれを再生するのはやや困難です。結局のところ、1 つのリクエストには 1 つの php プロセスが必要です (apache + php_mod を使用する場合でも、1 つのリクエストと 1 つのスレッドが必要です)。プレイするだけの人はほとんどいないので、まだ大丈夫ですが、オンラインの人が増えると、これは基本的に役に立たなくなります。したがって、プロセスをブロックせず、リクエストにすぐに応答できるポーリングを引き続き使用します。ただし、新たな問題は、リクエストをサーバーに継続的に送信する必要があり、間隔が長いほどメッセージの遅延が大きくなるということです。 。 大きい。
0x01 ゴージャスな変身
1秒は小さなカロリーである上記の状況を経験すると、3秒は大きなカロリーになります!もう我慢できなくなったので、本物の男に変身することにしました。ポーリングもクソ、ロングポーリングもクソ、ウェブサーバーもクソ、脇に置いてフラッシュソケット (またはウェブソケット) に世界を支配させましょう!本当の意味で長くつながる旅が始まりました。長い接続を扱うには、常にソケットを処理する必要があります。世界最高の言語 (誰も) として、ソケットのカプセル化は当然不可欠です。 socket_*** をコピーして作業を開始するだけで、次のような長い接続のコードが完成します。遅れましたね?ソケットですよね?スープと薬代ですよね?とても簡単です....
リーリー0x02 頂点への到達
私がソケットで遊び始めた日から、Google は私に優しくこう言いました。同時実行性が高い状態では select を使用しないでください。非効率です。win には iocp を使用し、Linux には epoll を使用してください。blablablabla...ああ!まあ、Google がそう言っているので、私は彼に反論することはできませんが、Google の言うことを聞いて epoll を始めることにしました (なぜそう言うのでしょうか?) が、私は自分でそれを書くことはできません。私のような怠け者は、全体を拡張したほうがよいでしょう。libevent がなくなってしまいました。クレイジーなコーディング (py) を経て、その傑作がどれほど効率的になり、どの程度の同時実行性をサポートできるようになるのでしょうか。それを構築しなければ、私は選択の余地がありません。
リーリー0x03 絶望的な状況からの生還
人数が増え、同時実行性が高まると、単一のプロセスでは需要を満たせなくなります。Tian Boguang の話では、一騎打ちでは P のグループに勝つことができないことが分かりました。ことわざにあるように、大きなものは小さく、小さなものは小さく、やめてください。 !溶かさないでください。また溶かすと消えてしまいます。それを分割して、単一のプロセスを複数のプロセスに分割しましょう。しかし、分割すると、プロセス間通信、負荷分散、セッションの一意性などの新たな問題に直面することになります。このような疑問が提起されたので、解決策があるはずです。swoole、workerman など、この問題を解決する既製の拡張機能とライブラリがあります。それに比べてスウールの方が色っぽさも機能性も含めてカッコいいですね!この略称はあまりエレガントではないようです。まあ、パフォーマンスと機能は優れています(トン兄弟、退屈であることを許してください〜)。 。 。 。ちょっと待って! ! !しかし、PHP を使用して Web 開発を行う場合、Web サーバー関連のライブラリを開発に使用することはありませんよね。私たちは単なるエコーにすぎません。こういった複雑なことはすべてnginxやapacheに引き継がれ、躊躇なく主導権を握ってくれるので、我々はロジックを書くことに集中できます。 Web を作成するには、nginx と fpm を設定するだけで済みます。ソケット サービスを作成する場合はどうでしょうか。なぜ nginx + fpm のように簡単に設定できないのでしょうか? ?もちろんそれは可能です、それは可能なはずです。 。 。 。 。このプロットを見ていると、広告が来るのではないかと心配になります。 。 。
0x04 予期せぬ
ソケット サービスの作成は、Web サービスの作成と同じように高度なものではありません。これらは両方ともコーディングと要件の完了ですが、1 つは nginx によって完了し、もう 1 つは自分で完了します。 。しかし、nginx+fpm、fooking+fpm=php のような長い接続、接続の伝送にゲートウェイ、メッセージの転送にルーター、プロセス間通信に似たソリューションを使用する必要はなくなりました。ロードバランシング?セッションのみ?とても簡単です..
リーリープロジェクトアドレス: http://git.oschina.net/scgywx/fooking
文書アドレス (随時更新): http://my.oschina.net/scgywx/blog/465186