ããã«äœ¿çšã§ããFastCGIãHTTPãCGIãFlashPolicyãTelnetã WebSocket ïŒïŒïŒ
å®äŸãšããŠã ãã®ãã£ããã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ã¢ã«ãŽãªãºã ããªãŒããŒã©ã€ãã§ããŸãã ãããžã§ã¯ããéçºããéãã³ã³ããŒãã³ãã®æ¡åŒµæ§ãšäº€ææ§ãããã³äœ¿ããããã®äž¡æ¹ã«éç¹ã眮ãããŸãã
ã€ã¹ã«ããã
çŸåšã次ã®ã¢ãžã¥ãŒã«ããã£ã¹ããªãã¥ãŒã·ã§ã³ã«å«ãŸããŠããŸãã
- FastCGI-FastCGIãããã³ã«ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ã§ããŸãã
- HTTP-HTTPçµç±ã§ã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ã§ããŸãã
- CGI-FastCGIãHTTPãããã³ãã®ä»ã®ãã©ã³ã¹ããŒãã䜿çšããŠãéåžžã®CGIã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ããŸãã
- Flashpolicy-ããŒã843ã§Flashã®ã¯ãã¹ãã¡ã€ã³ããªã·ãŒãé åžããŸãã
- WebSocketServer- WebSocketã»ãã·ã§ã³ãæäŸããŸãã
- MongoClient-MongoDBãã©ã€ããŒã
- MySQLClient-MySQLãã©ã€ããŒïŒSphinxQLã«æ¥ç¶ããããšãã§ããŸãïŒã
- MySQLProxyã¯ãããã·MySQLãµãŒããŒã§ãã
- MongoNode-MongoDBã¹ã¬ãŒãããŒãã®å®è£ ã«ãããããŒã¿ããŒã¹å ã®ãªããžã§ã¯ãã®å€æŽæã«ã€ãã³ãããã³ã°ãããããšãã§ããŸãã
- MemcacheClient-Memcacheãã©ã€ããŒã
- LockServerã¯åæ£ããã¯ãµãŒãã¹ã§ãã
- LockClientã¯ãç¬èªã®ããã¯ãµãŒãã¹ã®ã¯ã©ã€ã¢ã³ãã§ãã
- TelnetHoneypotã¯ãæãåçŽãªtelnetãµãŒããŒã§ãã
- RTEPServer / RTEPClient-ã¯ã©ã€ã¢ã³ããã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããŠããããã¢ããŠã³ã¹ã§ããããã«ãããªã¢ã«ã¿ã€ã ã€ãã³ããããã³ã«ã®å®è£ ã
- BitTorrentTracker-MongoDBã䜿çšããBitTorrentãã©ãã«ãŒã
- DebugConsoleã¯ãå®è¡äžã®ããã»ã¹ã§ã³ãŒããå®è¡ã§ããa-la telnet察話åãããã°ã³ã³ãœãŒã«ãµãŒããŒã§ãã
ããã«ããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãå«ãŸããŠããŸãã
ãã£ã¹ããªãã¥ãŒã·ã§ã³ã®ã¢ãžã¥ãŒã«ã楜ãã¿ã«ããŠããŸãïŒ
ã³ã¹ãã®çŸã家ã®å·èµåº«
ã©ã€ã»ã³ã¹-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åæ§ã®ã¢ãŒããã¯ãã£ã«æéãåããå Žå-ååãšããŠãã«ã¹ã¿ã ã¢ãžã¥ãŒã«ã®äœæããµããŒãå¯èœã§ãã