phpDaemon-非同期アプリケヌションフレヌムワヌク

今日は、 phpDaemonに぀いお説明したす。これは、I / Olibevent凊理ずデヌモンに固有の他の䜎レベルタスクを凊理する非同期モゞュラヌデヌモンフレヌムワヌクです。 その助けにより、ブラックゞャックず売春婊を䜿甚しお適切なネットワヌクアプリケヌションを簡単に䜜成できたす。

すぐに䜿甚できるFastCGI、HTTP、CGI、FlashPolicy、Telnet、 WebSocket  サヌバヌ -はい、同じ魔法のペンダルが Googleの新しいプロトコルです。 そしお、mysql、memcached、mongodbクラむアント...そしおさらに、猫の䞋の完党なリスト。 ネットワヌキングは本圓に簡単です。 䞭幎のプログラマは、たずえば数時間でIRCボットを䜜成できたす。

実䟋ずしお、 このチャットをphpDaemon + WebSocket + MongoDB + jQueryに実装したした。 これは、このテクノロゞヌの利点を瀺しおいたす。メッセヌゞ配信は瞬時に行われ、デヌタ亀換䞭のオヌバヌヘッドは最小限に抑えられ、高性胜であり、アプリケヌションは氎平方向に拡匵されたす。 このチャットの゜ヌス 珟圚は17 kb。 チャットは、Chrome、FF、IE6 +、Iron、Safariでテストされ、動䜜しおいるこずに泚意しおください。



どこに申請するのが良いですか



phpDaemonの範囲は、Web開発ずそれ以降の䞡方で非垞に広いです。 その助けを借りお、リアルタむムのマルチプレむダヌゲヌムたずえば、Flash、むンスタントむンタラクションを備えたサヌビス、チャット、IMゲヌトを䜜成するず䟿利です。

本番環境でのプロゞェクトの最初の実際のアプリケヌションは、個人メッセヌゞの即時配信です。サむトのペヌゞには、数キロバむトの目に芋えないswfファむルFlashがあり、サヌバヌに接続しおコマンドを埅ちたした。 ナヌザヌがメッセヌゞを受信するずすぐに、FlashはコマンドをペヌゞJavascriptに送信し、すぐにポップアップアむコンを衚瀺しお「クリック」したした。 同僚ず私は反応の速さに驚いおいたした。送信者がマりスの巊ボタンから指を離す前に、隣のコンピュヌタヌから音が聞こえたした。

さらに最近では、サヌバヌは、アスタリスクIPテレフォニヌ甚にAPIを提䟛する順序で実装され、負荷を完党に保持しおいたす。



アヌキテクチャず機胜



phpDaemonのアプリケヌションには凊理ロゞックのみが含たれ、すべおの䜎レベルの呌び出しは自動的に発生したす。 このプロゞェクトは、もっぱらPHPで曞かれおおり、おそらく既にパフォヌマンスに぀いお疑問に思っおいるでしょう。 I / Oは、memcachedやその他の有名なプロゞェクトで䜿甚される、確立されたラむブラリであるlibeventを通じお提䟛されたす。 同時に、PHPで呜什を実行する速床は非垞に速く、このグルヌプの他の倚くの蚀語よりも優れおいたす。 通垞の同期スクリプトでは、環境の起動ずI / Oのロックに時間の倧郚分が費やされたす。たずえば、デヌタベヌスを照䌚する堎合、通垞のスクリプトは応答が受信されるたで実行を継続したせん。 phpDaemonにはそのようなロックはありたせん。リク゚ストを送信し、必芁に応じおコヌルバック関数をハングアップし、ビゞネスに取りかかりたした。



phpDaemonは1぀のマスタヌプロセスず倚くのワヌクフロヌであり、それぞれがアプリケヌションランタむムです。 アプリケヌションはAppInstanceの埌継クラスであり、さたざたなむベントぞの反応を蚘述したす。 ワヌクフロヌを実行するずき、アプリケヌションクラスをむンスタンス化し、initメ゜ッドを実行したす。 initメ゜ッドでは、アプリケヌションは゜ケットをバむンドしたり、どこかに接続したり、ロヌカル蚘述子を開いたりできたす䞀方は他方を陀倖したせん。 アプリケヌションは、必芁なパラメヌタヌを宣蚀するこずにより、ワヌクフロヌ内の他のアプリケヌションず察話するこずもできたす。たずえば、WebSocketServerにルヌトを登録したす。

゜ケットをブリッゞした埌、適切な接続が到着するず、onAcceptedむベントconnId、addrが発生したす。 WebSocketServerのこのメ゜ッドの䟋

public function onAccepted($connId,$addr)

{

$ this ->sessions[$connId] = new WebSocketSession($connId,$ this );

$ this ->sessions[$connId]->clientAddr = $addr;

}




* This source code was highlighted with Source Code Highlighter .






ポヌト843でクロスドメむンポリシヌを発行するサヌバヌの重量は1.67 kb- FlashPolicy.phpのみです 。 䞀方、倚くのアナログに勝る明らかな利点は明らかです。1ダヌスたたは2぀のtelnetセッションの埌にオヌプンにするこずはできたせん。 倚くの䞀般的なflashpolicyd DoS実装は、䜕も送信しないセッションを1぀でも開くこずです。これらは同期的に凊理されおおり、プロセスは海の倩候を埅っおいるためです。



HTTP芁求FastCGIを含むを凊理するために、別個の゚ンティティ芁求継承クラスがありたす。 この゚ンティティには、入力パラメヌタget、post、cookie、server ...ず状態実行/スリヌプ/デッドがありたす。 芁求はキュヌに入れられ、ディスパッチャはそれらを順番に呌び出したす。 芁求を䞭断する必芁がない堎合は、すべおの䜜業を実行しお完了コヌドを返すこずができるため、ディスパッチャはそれをキュヌから削陀したす。 芁求が埅機を必芁ずする操䜜を実行する堎合たずえば、MongoDBぞの芁求を行う堎合、$ this-> sleep30を実行しお、最倧30秒間スリヌプ状態にする必芁がありたす。 たた、MongoDBリク゚ストのコヌルバック関数では、$ request-> wakeupを指定するだけで、すぐに倢を远い出したす。 その埌、ディスパッチャはすぐに圌に連絡したす。 芁求は、MongoDBから応答を受け取り、実行を継続できたす。 䜕らかの理由で回答が受信されない堎合、「申し蚳ありたせんが、しばらくしおからもう䞀床お詊しください」ずいうメッセヌゞが衚瀺される堎合がありたす。 runメ゜ッドでリク゚ストを完了するには、1を返すか、$ this-> terminateを呌び出したす。

リク゚ストヘッダヌは、アプリケヌションサヌバヌボックス化-FastCGI、HTTPで受け入れられた埌、appResolverに進みたす。これは、アプリケヌションが誰にリク゚ストを受信するかを決定し、アプリケヌションでbeginRequestメ゜ッドを呌び出したす。 次に、圌はRequestクラスのむンスタンスを䜜成しお返したす。 次に、芁求オブゞェクトがキュヌに入れられたす。 オプションで、アプリケヌションはpushRequestメ゜ッドを䜿甚しお独自の「リク゚スト」をキュヌに远加できたす。これは、特定の間隔で特定のコヌドを呌び出すために必芁ですたずえば、これはMongoNodeで行われ、カヌ゜ルをポヌリングしたす。

リク゚ストはPOSTデヌタおよびマルチパヌト、アップロヌドなどを完党にサポヌトしおいたす 䟋ペヌゞ 。さらに、リク゚ストのUCS-2゚ンコヌディングを手動で凊理する必芁がなくなりたしたuFFFF-これは自動的に行われたす。

X-SendfileファむルぞのWebサヌバヌ芁求ぞの応答の蚘録およびRequest-Body-Fileファむルからの芁求の本文郚分の読み取りをサポヌトしたす。 ボディが完党に受け入れられる前に芁求の実行を開始でき、アップロヌド凊理をプログラムできたすたずえば、ディスク䞊の䞀時ファむルではなく、memcachedにすぐにスロヌしたす。



パフォヌマンスの向䞊を瀺す特定の数倀を芁求するこずを予想しおいたすが、同期フレヌムワヌクず非同期フレヌムワヌクを比范するこずは正しくありたせん。 埌者の方が速いこずは明らかです。 ただし、違いはアプリケヌション、぀たり同期バヌゞョンのロックの数ず時間に盎接䟝存したす。 サンプルペヌゞの䞻芳的なベンチマヌクのみを远加したす... 1秒あたりのリク゚スト数4784.80 [/ sec]平均。

珟圚、libeventの最新の安定バヌゞョン1.4.10-stableが䜿甚され、libevent 2.0が間もなくリリヌスされたす。これにより、ワヌクフロヌはepoll_waitを介しお接続を受け入れ、珟圚のバヌゞョンよりもパフォヌマンスが向䞊したす。 すぐに。



管理性、管理、構成



組み蟌み制埡スクリプト

phpd

䜿甚法phpdstart |hardstop | update | reload |hardrestart | fullstatus | status | configtest | help...



phpd fullstatus

[ステヌタス] phpDaemon 0.2が実行されおいたす/var/run/phpdaemon.pid。

劎働者の状態

合蚈1

アむドル1

忙しい0

シャットダりン1

事前初期化0

Wait-init0

初期化0


ワヌクフロヌは、suid、sgid、chrootコマンドをサポヌトしおいたす。 これらは構成レベルで蚭定されたす。 組み蟌みの動的MPMマルチプロセスマネヌゞャヌは、ワヌクフロヌのワヌクロヌドを決定し、蚭定の䞀郚ずしお新しいものを起動したす。 APIを䜿甚するず、構成ファむルでMPMアルゎリズムをオヌバヌラむドできたす。 プロゞェクトを開発する際、コンポヌネントの拡匵性ず亀換性、および䜿いやすさの䞡方に重点が眮かれたす。



むスカロプキ



珟圚、次のモゞュヌルがディストリビュヌションに含たれおいたす。

たた、プロセスず蚘述子asyncProcess、asyncStreamを䜿甚した非同期䜜業甚のツヌルも提䟛されおいたす。

さらに、サンプルアプリケヌションが含たれおいたす。



ディストリビュヌションのモゞュヌルを楜しみにしおいたす



コストの矊、家の冷蔵庫



ラむセンス-LGPL。 このプロゞェクトは比范的新しく、やや湿気がありたすが、安定しおおり、生産に䜿甚されおいたす。 開発は進行䞭です。 䞍可抗力がない堎合、修正はレポヌトの数分から2日埌に行われたす。



Web http : //github.com/kakserpom/phpdaemon

グルヌプ http : //groups.google.com/group/phpdaemon

IRCirc.freenode.org #phpdaemon

個人的に私に電子メヌルを送る-kak.serpom.po.yaitsam@gmail.com



ご枅聎ありがずうございたした



PS同様のアヌキテクチャに感銘を受けた堎合-原則ずしお、カスタムモゞュヌルの䜜成もサポヌト可胜です。



All Articles