
PHPãšã¹ã¬ããã ããã4åèªã®æã§ããã®ãããã¯ã«ã€ããŠã¯æ¬ãæžãããšãã§ããŸãã ãã€ãã®ããã«ãç§ã¯ãããããŸããããããªããäž»é¡ãããçšåºŠçè§£ãå§ããããã«æ
å ±ãæäŸããŸãã
äžéšã®ããã°ã©ããŒãé ã«æ±ããŠããæ··ä¹±ããå§ããŸãããã PHPã¯ãã«ãã¹ã¬ããèšèªã§ã¯ãããŸããã PHPèªäœã®å
éšã§ã¯PHPã¹ã¬ããã¯äœ¿çšãããŸããããŸããPHPã§ã¯ããŠãŒã¶ãŒã³ãŒãããããã䞊ååã¡ã«ããºã ãšããŠãã€ãã£ãã«äœ¿çšããããšãèš±å¯ããŠããŸããã
PHPã¯ä»ã®ãã¯ãããžãŒãšã¯ããé¢ããŠããŸãã ããšãã°ãJavaã§ã¯ãã¹ã¬ããã¯éåžžã«é »ç¹ã«äœ¿çšãããŸããããŠãŒã¶ãŒããã°ã©ã ã§ãèŠã€ããããšãã§ããŸãã PHPã§ã¯ããã¯ããã§ã¯ãããŸããã ãããŠãããã«ã¯çç±ããããŸãã
PHPãšã³ãžã³ã¯ãäž»ã«æ§é ãåçŽåããããã«ãå®è¡ã®ã¹ã¬ãããçããŸãã æ¬¡ã®ã»ã¯ã·ã§ã³ãèªããšãã¹ã¬ããã¯ãããã°ã©ã ãé«éåããéæ³ã®æè¡ãã§ã¯ãªãããšãããããŸãã 売ãæã®ã¹ããŒãã®ããã§ããã ããããç§ãã¡ã¯ãã¬ãŒããŒã§ã¯ãããŸãã-ç§ãã¡ã¯æè¡è
ã§ãããç§ãã¡ã話ããŠããããšãç¥ã£ãŠããŸãã çŸåšãPHPãšã³ãžã³ã«ã¯ã¹ã¬ããããããŸããã ããããå°æ¥çã«ã¯ç»å Žããã§ãããã ããããããã«ã¯éåžžã«å€ãã®å°é£ã䌎ããããçµæã¯äºæ³ããã¯ã»ã©é ããããããŸããã äž»ãªåé¡ã¯ãã¯ãã¹ãã©ãããã©ãŒã ã®ãã«ãã¹ã¬ããããã°ã©ãã³ã°ïŒã¹ã¬ããããã°ã©ãã³ã°ïŒã§ãã 2çªç®ã®åé¡ã¯ãå
±æãªãœãŒã¹ãšããã¯ç®¡çã§ãã 第äžã«ãã¹ã¬ããã¯ãã¹ãŠã®ããã°ã©ã ã«é©ããŠããããã§ã¯ãããŸããã PHPã¢ãŒããã¯ãã£ã¯2000幎é ã«èªçããåœæã¯ã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ãæ®åããŠãããæªçã§ã¯ãããŸããã§ããã ãã®ãããPHPã®äœæè
ïŒäž»ã«Zendãšã³ãžã³ïŒã¯ãã¹ã¬ãããªãã§ãšã³ãžã³å
šäœãäœæããããšã«ããŸããã ãŸããå®å®ããã¯ãã¹ãã©ãããã©ãŒã ãã«ãã¹ã¬ãããšã³ãžã³ãäœæããããã«å¿
èŠãªãªãœãŒã¹ããããŸããã§ããã
ãŸããã¹ã¬ããã¯PHPãŠãŒã¶ãŒç©ºéã§ã¯äœ¿çšã§ããŸããã ãã®èšèªã¯ã³ãŒããæ£ããå®è¡ããŸããã PHPã®æŠå¿µ-ãã·ã§ããã¢ã³ããã©ãŒã²ãããã æ¬¡ã®ãªã¯ãšã¹ãã®ããã«PHPãè§£æŸããããã«ããªã¯ãšã¹ãã¯ã§ããã ãæ©ãåŠçããå¿
èŠããããŸãã PHPã¯æ¥ç¶èšèªãšããŠäœæãããŸãããã¹ã¬ãããå¿
èŠãšããè€éãªã¿ã¹ã¯ã¯åŠçããŸããã 代ããã«ãé«éã§ããã«äœ¿çšã§ãããªãœãŒã¹ã䜿çšãããã¹ãŠããŸãšããŠãŠãŒã¶ãŒã«éãè¿ããŸãã PHPã¯ã¢ã¯ã·ã§ã³èšèªã§ãããäœãããéåžžãããé·ãæéãåŠçããå¿
èŠãããå ŽåãPHPã§ãããè¡ãã¹ãã§ã¯ãããŸããã ãããã£ãŠãããã€ãã®éãã¿ã¹ã¯ã®éåæåŠçã«ã¯ããã¥ãŒããŒã¹ã®ã·ã¹ãã ã䜿çšãããŸãïŒã®ã¢ãã³ãAMQPãActiveMQãªã©ïŒã Unixã§ã¯ããããè¡ãã®ãæ
£äŸã§ãããå°åã®èªå·±å®çµåããŒã«ãéçºããããããçžäºã«æ¥ç¶ããŸããã PHPã¯ã¢ã¯ãã£ããªäžŠååçšã«èšèšããããã®ã§ã¯ãªããä»ã®ãã¯ãããžãŒã®éåœã§ãã ãã¹ãŠã®åé¡ã¯é©åãªããŒã«ã§ãã
ã¹ã¬ããã«ã€ããŠã®äžèš
å®è¡ã®ã¹ã¬ãããæŽæ°ããŸãããã 詳现ã«ã€ããŠã¯èª¬æããŸããããã€ã³ã¿ãŒããããæžç±ã§èŠã€ããããšãã§ããŸãã
å®è¡ã®ã¹ã¬ããã¯ãããã»ã¹å
ã«ãããå°ããªãäœæ¥åäœïŒè»œãäœæ¥åäœåŠçïŒã§ãã ããã»ã¹ã¯ãå®è¡ã®è€æ°ã®ã¹ã¬ãããäœæã§ããŸãã ã¹ã¬ããã¯ã1ã€ã®ããã»ã¹ã®ã¿ã®äžéšã§ããå¿
èŠããããŸãã ããã»ã¹ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã å
ã®ã倧ããªãåŠçãŠãããã§ãã ãã«ãã³ã¢ïŒãã«ãããã»ããµãŒïŒã³ã³ãã¥ãŒã¿ãŒã§ã¯ãããã€ãã®ã³ã¢ïŒããã»ããµãŒïŒã䞊è¡ããŠåäœããå®è¡å¯èœã¿ã¹ã¯ã®è² è·ã®äžéšãåŠçããŸãã ããã»ã¹AãšBããã¥ãŒã€ã³ã°ã®æºåãã§ããŠããã2ã€ã®ã³ã¢ïŒããã»ããµïŒãåäœããæºåãã§ããŠããå ŽåãAãšBãåæã«åŠçã«éä¿¡ããå¿
èŠããããŸãã ãã®åŸãã³ã³ãã¥ãŒã¿ãŒã¯åäœæéïŒæéééãæéæ ïŒããšã«è€æ°ã®ã¿ã¹ã¯ãå¹ççã«åŠçããŸãã ãããã䞊ååŠçããšåŒã³ãŸãã
ããã»ã¹ïŒ

å®è¡ã®ã¹ã¬ããïŒ

ãã¹ãŠäžç·ã«ïŒ

Aããã³Bã¯ã以åã¯å®å
šã«ç¬ç«ãããã³ãã©ãŒã§ããã ããããå®è¡ã®ã¹ã¬ããã¯ããã»ã¹ã§ã¯ãããŸããã ã¹ããªãŒã ã¯ãããã»ã¹å
ã«ååšãããŠãããã§ãã ã€ãŸããããã»ã¹ã¯ãåæã«å®è¡ãããããã€ãã®å°ããªã¿ã¹ã¯ã«äœæ¥ã忣ã§ããŸãã ããšãã°ãããã»ã¹Aããã³Bã¯ããããŒA1ãA2ãB1ãããã³B2ãçæã§ããŸãã ã³ã³ãã¥ãŒã¿ãŒã«è€æ°ã®ããã»ããµãŒïŒäŸãã°8åïŒãè£
åãããŠããå Žåã4ã€ã®ã¹ã¬ãããã¹ãŠãåãæéééïŒæéæ ïŒã§å®è¡ã§ããŸãã
å®è¡ã¹ã¬ããã¯ãããã»ã¹ã®äœæ¥ãã䞊è¡ããŠïŒ1ã€ã®æéééã§ïŒè§£æ±ºãããããã€ãã®å°ããªãµãã¿ã¹ã¯ã«åå²ããæ¹æ³ã§ãã ããã«ãã¹ã¬ããã¯ããã»ã¹ãšã»ãŒåãæ¹æ³ã§å®è¡ãããŸããã«ãŒãã«ããã°ã©ã ã¹ã¬ãããããŒãžã£ãŒïŒã«ãŒãã«ã¹ã¬ããã¹ã±ãžã¥ãŒã©ãŒïŒã¯ãç¶æ
ã䜿çšããŠã¹ã¬ããã管çããŸãã

ã¹ã¬ããã¯ããã»ã¹ããã軜ãã®ã§ãã¹ã¿ãã¯ãšããã€ãã®ã¬ãžã¹ã¿ãå¿
èŠãªã ãã§ãã ããããããã»ã¹ã«ã¯å€ãã®ããšãå¿
èŠã§ããã«ãŒãã«ããã®æ°ããä»®æ³ãã·ã³ãã¬ãŒã ïŒVMãã¬ãŒã ïŒãããŸããŸãªã·ã°ãã«æ
å ±ããã¡ã€ã«èšè¿°åãããã¯ãªã©ã«é¢ããæ
å ±ã§ãã
ããã»ã¹ã¡ã¢ãªã¯ããŒããŠã§ã¢ã¬ãã«ã§ã«ãŒãã«ãšMMUã«ãã£ãŠç®¡çãããã¹ã¬ããã¡ã¢ãªã¯ãœãããŠã§ã¢ã¬ãã«ã§ããã°ã©ããšã¹ã¬ããã©ã€ãã©ãªã«ãã£ãŠç®¡çãããŸãã
ãã®ãããã¹ã¬ããã¯ããã»ã¹ããã軜ãã管çãç°¡åã§ãã é©åã«äœ¿çšãããšãOSã«ãŒãã«ã¯ã¹ã¬ããã®å¶åŸ¡ãšãã£ã¹ããããã»ãšãã©åŠšããªããããããã»ã¹ãããé«éã«åäœããŸãã
ã¹ã¬ããã¡ã¢ãªã¹ããŒã
ã©ã³ã¿ã€ã ã¹ã¬ããã«ã¯ç¬èªã®ã¹ã¿ãã¯ããããŸãã ãããã£ãŠã颿°ã§å®£èšããã倿°ã«ã¢ã¯ã»ã¹ãããšããã®ããŒã¿ã®ç¬èªã®ã³ããŒãååŸããŸãã
ããã»ã¹ããŒãã¯ãã°ããŒãã«å€æ°ããã¡ã€ã«èšè¿°åãšåæ§ã«ã¹ã¬ããã«ãã£ãŠå
±æãããŸãã ããã¯é·æã§ãããçæã§ããããŸãã ã°ããŒãã«ã¡ã¢ãªããã®èªã¿åãã®ã¿ãè¡ãå Žåã¯ãæéã©ããã«ãããè¡ãå¿
èŠããããŸãã ããšãã°ãã¹ããªãŒã Xã®åŸãã¹ããªãŒã Yã®åã§ããã°ããŒãã«ã¡ã¢ãªã«æžã蟌ãå Žåãããã«è€æ°ã®ã¹ããªãŒã ãèšé²ããããšãã詊ã¿ããªãããšã確èªãã䟡å€ããããŸãã ããããªããšããã®ã¡ã¢ãªé åã¯äºæž¬äžå¯èœãªç¶æ
ãããããç«¶åç¶æ
ã«ãªããŸãã ãããã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ã®äž»ãªåé¡ã§ãã
åæã¢ã¯ã»ã¹ã®å Žåãåå
¥å¯èœæ§ãåæã«ãŒãã³ãªã©ã®ããã€ãã®ã¡ã«ããºã ãã³ãŒãã«å®è£
ããå¿
èŠããããŸãã åå
¥åã¯äžŠè¡æ§ã«éåããŸãã ãŸããåæã«ãããäžè²«æ§ãäºæž¬å¯èœãªæ¹æ³ã§ç®¡çã§ããŸãã
ããã»ã¹ã¯ã¡ã¢ãªãå
±æãããOSã¬ãã«ã§çæ³çã«åé¢ãããŸãã ãŸãã1ã€ã®ããã»ã¹å
ã®å®è¡ã¹ã¬ããã¯å€§éã®ã¡ã¢ãªãå
±æããŸãã
ãããã£ãŠãã»ããã©ããã¥ãŒããã¯ã¹ãªã©ãå
±æã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãåæããããŒã«ãå¿
èŠã§ãã ãããã®ããŒã«ã®åäœã¯ããããã¯ãã®ååã«åºã¥ããŠããŸãããªãœãŒã¹ãããã¯ãããã¹ã¬ãããããã«ã¢ã¯ã»ã¹ããããšãããšãããã©ã«ãã§ã¹ã¬ããã¯ãªãœãŒã¹ã®ããã¯è§£é€ãåŸ
æ©ããŸãã ãããã£ãŠãå®è¡ã®ã¹ã¬ããã ãã§ã¯ããã°ã©ã ãé«éåãããããšã¯ãããŸããã ã¹ã¬ããéã§ã¿ã¹ã¯ãå¹ççã«åæ£ããå
±æã¡ã¢ãªããã¯ã管çããªããšãå®è¡ã¹ã¬ããã®ãªãåäžã®ããã»ã¹ã䜿çšãããããããã°ã©ã ã®å®è¡ãããã«é
ããªããŸãã ã¹ã¬ããããäºããåžžã«åŸ
ã¡ç¶ãããšããã ãã§ãïŒãããŠããããããã¯ã飢vãªã©ã«ã€ããŠè©±ããŠããããã§ã¯ãããŸããïŒã
ã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ã®çµéšããªãå Žåã¯ãé£ããäœæ¥ã§ããããšãããããŸãã ã¯ãŒã¯ãããŒã®çµéšãç©ãã«ã¯ãäœæéãã®ç·Žç¿ãšWTFã®ç¬éã®è§£æ±ºãå¿
èŠã§ãã ã¡ãã£ãšããããšã¯å¿ããŠãã䟡å€ããããŸããããã°ã©ã å
šäœãç Žå£ãããŸãã 1ã€ã®ããã»ã¹ã«æ°çŸãŸãã¯æ°åã®ã¹ã¬ãããå«ãå®éã®ãããžã§ã¯ãã«ã€ããŠè©±ããŠããå Žåãã¹ã¬ããã䜿çšãããããã¹ã¬ããã䜿çšããŠããã°ã©ã ããããã°ããæ¹ãå°é£ã§ãã ããªãã¯å€¢äžã«ãªããããããã¹ãŠã«justããŸãã
ã¹ããªãŒã ããã°ã©ãã³ã°ã¯é£ããäœæ¥ã§ãã ãã¹ã¿ãŒã«ãªãã«ã¯ãå€ãã®æéãšåŽåãè²»ããå¿
èŠããããŸãã
ãã®ã¹ã¬ããå
±æã¹ããŒã ã¯åžžã«äŸ¿å©ã§ãããšã¯éããŸããã ãã®ãããã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžïŒã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžãTLSïŒãç»å ŽããŸããã TLSã¯ãã1ã€ã®ãããŒã«å±ããä»ã®ãããŒã«ã¯äœ¿çšãããªãã°ããŒãã«ããšèª¬æã§ããŸãã ãããã¯ãç¹å®ã®å®è¡ã¹ã¬ããå°çšã®ã°ããŒãã«ç¶æ
ãåæ ããã¡ã¢ãªé åã§ãïŒããã»ã¹ã®ã¿ã䜿çšããå Žåã®ããã«ïŒã ã¹ã¬ãããäœæãããšãããã»ã¹ããŒãã®äžéšïŒã¹ãã¬ãŒãžïŒãå²ãåœãŠãããŸãã ã¹ããªãŒã ã©ã€ãã©ãªã«ã¯ããã®ãªããžããªã«é¢é£ä»ããããŠããããŒãèŠæ±ãããŸãã ãªããžããªã«ã¢ã¯ã»ã¹ãããã³ã«å®è¡ã¹ã¬ããã§äœ¿çšããå¿
èŠããããŸãã ã¹ããªãŒã ã®å¯¿åœã®çµããã«å²ãåœãŠããããªãœãŒã¹ãç Žæ£ããã«ã¯ããã¹ãã©ã¯ã¿ãå¿
èŠã§ãã
ã°ããŒãã«ãªãœãŒã¹ãžã®ãã¹ãŠã®åŒã³åºããå®å
šã«å¶åŸ¡ãããå®å
šã«äºæž¬å¯èœãªå Žåãã¹ã¬ããã»ãŒãã¢ããªã±ãŒã·ã§ã³ã ããããªããšãã¹ã±ãžã¥ãŒã©ãŒãéãåãéããŸããäžéšã®ã¿ã¹ã¯ãäºæããå®è¡ãããããã©ãŒãã³ã¹ãäœäžããŸãã
ã¹ããªãŒã ã©ã€ãã©ãª
ã¹ã¬ããã«ã¯ãOSã«ãŒãã«ã®æ¯æŽãå¿
èŠã§ãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ã1990幎代åã°ã«ã¹ã¬ãããç»å Žãããããã¹ã¬ãããæäœããããã®ææ³ã¯æŽç·ŽãããŸããã
ããããã¯ãã¹ãã©ãããã©ãŒã ã®åé¡ããããŸãã Windowsã·ã¹ãã ãšUnixã·ã¹ãã ã«ã¯ç¹ã«å€ãã®éãããããŸãã ãããã®ãšã³ã·ã¹ãã ã¯ãããŸããŸãªã¹ããªãŒãã³ã°å®è¡ã¢ãã«ãæ¡çšããŠãããããŸããŸãªã¹ããªãŒãã³ã°ã©ã€ãã©ãªã䜿çšããŠããŸãã
Linuxã§ã¯ãã«ãŒãã«ã¯cloneïŒïŒãåŒã³åºããŠã¹ã¬ãããŸãã¯ããã»ã¹ãäœæããŸãã ããããéåžžã«è€éã§ãããããæ¯æ¥ã®ã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ã容æã«ããããã«ãã·ã¹ãã ã³ãŒã«ã¯Cã³ãŒãã䜿çšããŸãã Libcã¯åŒãç¶ãã¹ããªãŒãã³ã°æäœãå¶åŸ¡ããŸããïŒC11ã®æšæºã©ã€ãã©ãªã¯åæ§ã®ã€ãã·ã¢ããã瀺ããŸãïŒãå€éšã©ã€ãã©ãªã¯ãããè¡ããŸãã 仿¥ãUnixã·ã¹ãã ã§ã¯ãéåžžpthreadã䜿çšãããŸãïŒä»ã®ã©ã€ãã©ãªããããŸãïŒã Pthreadã¯Posixã¹ã¬ããã®ç¥ã§ãã ãã®ã¹ã¬ããã®äœ¿çšãšãã®åäœã®POSIXæ£èŠåã¯ã1995幎ã«é¡ããŸãã ã¹ã¬ãããå¿
èŠãªå Žåã¯ã libpthreadã©ã€ãã©ãªãæå¹ã«ããŸãã- lpthreadãGCCã«æž¡ããŸãã Cã§æžãããŠããã ã³ãŒãã¯ãªãŒãã³ã§ ãç¬èªã®ããŒãžã§ã³ç®¡çãšããŒãžã§ã³ç®¡çã¡ã«ããºã ããããŸãã
ãã®ãããUnixã·ã¹ãã ã§ã¯ã pthreadã©ã€ãã©ãªãæãé »ç¹ã«äœ¿çšãããŸãã äžŠè¡æ§ãæäŸããäžŠè¡æ§ã¯ç¹å®ã®OSãšã³ã³ãã¥ãŒã¿ãŒã«äŸåããŸãã
äžè²«æ§ãšã¯ãè€æ°ã®ã¹ã¬ãããåãããã»ããµã§ã©ã³ãã ã«å®è¡ãããå Žåã§ãã äžŠè¡æ§ãšã¯ãè€æ°ã®ã¹ã¬ãããç°ãªãããã»ããµã§åæã«å®è¡ãããŠããå Žåã§ãã
äžè²«æ§ïŒ

äžŠè¡æ§ïŒ

PHPãšã¹ã¬ãã
éå§ããã«ã¯ãèŠããŠãããŠãã ããïŒ
- PHPã«ã¯å®è¡ã¹ã¬ããã¯ãããŸããããã®ãšã³ãžã³ãšã³ãŒãã¯ãå
éšäœæ¥ã䞊ååããã¹ã¬ãããäžèŠã«ããŸãã
- PHPã¯ãŠãŒã¶ãŒã«ã¹ã¬ãããæäŸããŸãããPHPã§ãããããã€ãã£ãã«äœ¿çšããããšã¯ã§ããŸããã PHPéçºè
ã®1人ã§ããJoe Watkinsã¯ããŠãŒã¶ãŒç©ºéã«ã¹ã¬ããã远å ããåªããã©ã€ãã©ãªext / pthreadãäœæããŸãã ã ããããå人çã«ã¯ããã®ãããªã¿ã¹ã¯ã«ã¯PHPãéžæããŸããããããç®çãšããã®ã§ã¯ãªããCãŸãã¯Javaã䜿çšããæ¹ãããã§ãããã
ã§ã¯ãPHPã®å®è¡ã¹ã¬ããã¯ã©ãã§ããããïŒ
PHPããªã¯ãšã¹ããåŠçããæ¹æ³
åé¡ã¯ãPHPãHTTPãªã¯ãšã¹ããã©ã®ããã«åŠçãããã§ãã WebãµãŒããŒã¯ãè€æ°ã®ã¯ã©ã€ã¢ã³ãã«åæã«ãµãŒãã¹ãæäŸããããã«ãããçš®ã®äžè²«æ§ïŒãŸãã¯äžŠè¡æ§ïŒãæäŸããå¿
èŠããããŸãã å®éãããã¯ã©ã€ã¢ã³ãã«çãããšãä»ã®ãã¹ãŠã®ã¯ã©ã€ã¢ã³ããäžæåæ¢ãããããšã¯äžå¯èœã§ãã
ãããã£ãŠããµãŒããŒã¯éåžžãè€æ°ã®ããã»ã¹ãŸãã¯è€æ°ã®ã¹ã¬ããã䜿çšããŠã¯ã©ã€ã¢ã³ãã«å¿çããŸãã
æŽå²çã«ãããã»ã¹ã¯Unixã§åäœããŸãã Unixã®åºç€ã«ãããŸããããã®èªçã«ã¯ãæ°ããããã»ã¹ãäœæïŒ fork()
ïŒãããããwaitpid()
exit()
ïŒãåæïŒ wait()
ã waitpid()
ïŒã§ããããã»ã¹ããããŸãã ãã®ãããªç°å¢ã§ã¯ã倿°ã®PHPã倿°ã®ã¯ã©ã€ã¢ã³ãèŠæ±ãåŠçããŸãã ãããã 誰ããèªåã®ããã»ã¹ã§åããŠããŸã ã
ãã®ç¶æ³ã§ã¯ãPHPã¯äœã®åœ¹ã«ãç«ã¡ãŸãããããã»ã¹ã¯å®å
šã«åé¢ãããŠããŸãã ã¯ã©ã€ã¢ã³ãAã®ããŒã¿ã«é¢ãããªã¯ãšã¹ãAãåŠçããããã»ã¹Aã¯ãã¯ã©ã€ã¢ã³ãBã®ãªã¯ãšã¹ãBãåŠçããããã»ã¹Bãšå¯Ÿè©±ïŒèªã¿åããŸãã¯æžã蟌ã¿ïŒã§ããŸããããããå¿
èŠã§ãã
98ïŒ
ã®ã±ãŒã¹ã§ã¯ã php- fpmãšmpm_preforkãåããApacheã®2ã€ã®ã¢ãŒããã¯ãã£ã䜿çšãããŠããŸã ã
Windowsã§ã¯ãã¹ã¬ããã䜿çšããUnixãµãŒããŒã®ããã«ããã¹ãŠãããè€éã§ãã
Windowsã¯æ¬åœã«çŽ æŽãããOSã§ãã å¯äžã®æ¬ ç¹ããããŸã-ã¯ããŒãºããœãŒã¹ã ãããããªã³ã©ã€ã³ãŸãã¯æžç±ã§ã¯ãå€ãã®æè¡ãªãœãŒã¹ã®å
éšæ§é ã«é¢ããæ
å ±ãèŠã€ããããšãã§ããŸãã Microsoftã®ãšã³ãžãã¢ã¯ã Windowsã®ä»çµã¿ã«ã€ããŠå€ãã®ããšãèªã£ãŠããŸãã
Windowsã«ã¯ãäžè²«æ§ãšäžŠè¡æ§ã«å¯Ÿããç°ãªãã¢ãããŒãããããŸãã ãã®OSã¯ãã¹ã¬ããã¹ã¬ãããéåžžã«ç©æ¥µçã«äœ¿çšããŸãã åºæ¬çã«ãWindowsã§ã®ããã»ã¹ã®äœæã¯éåžžã«é£ããã¿ã¹ã¯ã§ãããããéåžžã¯åé¿ãããŸãã 代ããã«ãåžžã«ã©ãã§ãã¹ã¬ãããé©çšãããŸãã Windowsã®ã¹ããªãŒã ã¯ãLinuxãããæ¡éãã«åŒ·åã§ãã ã¯ããæ£ç¢ºã«ã
PHPãWindowsäžã§å®è¡ãããå ŽåãWebãµãŒããŒïŒanyïŒ ã¯ãã¯ã©ã€ã¢ã³ãèŠæ±ãprocessesã§ã¯ãªãã¹ã¬ããã§åŠçããŸã ã ã€ãŸãããã®ãããªç°å¢ã§ã¯ãPHPã¯ã¹ã¬ããã§å®è¡ãããŸãã ãã®ãããã¹ã¬ãã仿§ã«ç¹ã«æ³šæããå¿
èŠããããŸã ã ã¹ã¬ããã»ãŒãã§ããå¿
èŠããããŸã ã
PHPã¯ãã¹ã¬ããã»ãŒãã§ããå¿
èŠããããŸããã€ãŸããPHPãäœæãããã®ã§ã¯ãªãããã®äžã§ããããŠããã§åäœããäžè²«æ§ã管çããªããã°ãªããŸããã ã€ãŸããç¬èªã®ã°ããŒãã«å€æ°ãžã®ã¢ã¯ã»ã¹ãä¿è·ããŸãã ãŸããPHPã«ã¯å€ãã®æ©èœããããŸãã
Zend Thread Safetyã¬ãã«ïŒZTSã Zend Thread Safety ïŒã¯ããã®ä¿è·ãæ
åœããŸãã
ã¹ã¬ããã䜿çšããŠã¯ã©ã€ã¢ã³ãèŠæ±åŠçã䞊ååããå ŽåãUnixã§ãåãããšãåœãŠã¯ãŸãããšã«æ³šæããŠãã ããã ããããUnixã·ã¹ãã ã®å Žåãå€å
žçãªããã»ã¹ããã®ãããªã¿ã¹ã¯ã«äŒçµ±çã«äœ¿çšãããŠãããããããã¯éåžžã«çããç¶æ³ã§ãã ã¹ã¬ããã®éžæã«æ©ã人ã¯ããŸããããããã©ãŒãã³ã¹ãæ¹åã§ããŸãã ã¹ã¬ããã¯ããã»ã¹ããã軜ããããã·ã¹ãã ã¯ããå€ãã®ã¹ã¬ãããå®è¡ã§ããŸãã ãŸããPHPæ¡åŒµæ©èœã«ã¹ã¬ããã»ãŒãïŒext / pthreadãªã©ïŒãå¿
èŠãªå Žåã¯ãã¹ã¬ããã»ãŒããªPHPãå¿
èŠã«ãªããŸãã
ZTSå®è£
ã®è©³çް
ZTSã¯ã --enable-maintainer-ztsã䜿çšããŠã¢ã¯ãã£ãåãããŸãã éåžžãWindowsã§PHPãå®è¡ããªãå ŽåããŸãã¯ãšã³ãžã³ãã¹ã¬ããã»ãŒãã«ããå¿
èŠãããæ¡åŒµæ©èœã䜿çšããŠPHPãå®è¡ããªãå Žåããã®ã¹ã€ããã¯å¿
èŠãããŸããã
çŸåšã®åäœã¢ãŒãã確èªããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã CLIãšphp âv
ã¯ãNTSïŒã¹ã¬ããã»ãŒãã§ã¯ãªãïŒãŸãã¯ZTSïŒã¹ã¬ããã»ãŒãïŒãã¢ã¯ãã£ãã«ãªã£ãããšãéç¥ããŸãã

phpinfo()
䜿çšããããšãã§ããŸãïŒ

ã³ãŒãå
ã®PHPããPHP_ZTS
宿°ãèªã¿åãããšãã§ããŸãã
if (PHP_ZTS) { echo "You are running a thread safe version of the PHP engine"; }
ZTSã§ã³ã³ãã€ã«ãããšãPHPã®åºç€å
šäœãã¹ã¬ããã»ãŒãã«ãªããŸãã ãã ããã¢ã¯ãã£ãåãããæ¡åŒµæ©èœã¯ã¹ã¬ããã»ãŒãã§ã¯ãªãå ŽåããããŸãã å
¬åŒã®æ¡åŒµæ©èœïŒPHPã§é
åžïŒã¯ãã¹ãŠå®å
šã§ããããµãŒãããŒãã£ã®æ¡åŒµæ©èœãä¿èšŒããããšã¯ã§ããŸããã PHPæ¡åŒµæ©èœã®ã¹ã¬ããã»ãŒãããã¹ã¿ãŒããã«ã¯ãAPIãç¹å¥ã«äœ¿çšããå¿
èŠãããããšãããããŸãã ãããŠãããã¯ã¹ã¬ããã§çµ¶ããçºçããããã1ã€çç¥ãããŸã- ãµãŒããŒå
šäœã厩å£ããå¯èœæ§ããããŸã ã
å®è¡ã¹ã¬ããã䜿çšããå Žåããªãšã³ãã©ã³ã颿°ïŒéåžžlibcããïŒãåŒã³åºããªãããçã®ã°ããŒãã«å€æ°ã«ç²ç®çã«ã¢ã¯ã»ã¹ããªããšããã¹ãŠã®å
åŒã¹ã¬ããã§å¥åŠãªåäœãçºçããŸã ã ããšãã°ã1ã€ã®æ¡åŒµæ©èœã§ã¹ã¬ãããæ··ä¹±ãã-ããã¯ããµãŒããŒã®ãã¹ãŠã®ã¹ã¬ããã§æäŸããããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«åœ±é¿ããŸãïŒ ã²ã©ãç¶æ³ïŒ1人ã®ã¯ã©ã€ã¢ã³ããä»ã®ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãããŒã¿ãå°ç¡ãã«ããããšãã§ããŸãã
PHPæ¡åŒµæ©èœãèšèšããå ŽåïŒ
- ã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ã«é¢ããååãªæ³šæãšååãªç¥èãå¿
èŠã§ãã ããããªããšããµãŒããŒãå®å
šã«äºæž¬äžèœã«ç Žæããååãªé床ã§ãããã°ã§ããªããªããŸãã
- ã¹ã¬ãããééããå ŽåããµãŒããŒäžã®ãã¹ãŠã®ã¹ã¬ããããµãŒãã¹ãæäŸãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«åœ±é¿ããŸãã 誀ã£ãã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ã¯éåžžãåçŸã容æã§ã¯ãªãã²ã©ãäºæž¬äžå¯èœãªåäœãåŒãèµ·ãããããããã«æ°ä»ããªãããšãããããŸãã
ãªãšã³ãã©ã³ã颿°
PHPæ¡åŒµã¢ãžã¥ãŒã«ãèšèšãããšãã¯ã ãªãšã³ãã©ã³ã颿°ã䜿çšããŸã ããã®é¢æ°ã®æäœã¯ã°ããŒãã«ç¶æ
ã«äŸåããŸããã ããã¯ããŸãã«ãåçŽãããŸããã ãã詳现ã«ã¯ãåã®åŒã³åºããå®äºãããŸã§ãåå
¥å¯èœãªé¢æ°ãåŒã³åºãããšãã§ããŸãã 2ã€ä»¥äžã®ã¹ã¬ããã§äžŠè¡ããŠåäœã§ããŸãã ã°ããŒãã«ã¹ããŒãã䜿çšããå Žåããªãšã³ãã©ã³ãã«ã¯ãªããŸããã ãã ããç¬èªã®ã°ããŒãã«ç¶æ
ããããã¯ã§ãããããã¹ã¬ããã»ãŒãã«ãªããŸããïŒlibcã®åŸæ¥ã®é¢æ°ã®å€ãã¯ãã¹ã¬ããããŸã çºæãããŠããªããšãã«äœæããããããä¿¡é Œã§ããŸããã
ãã®ãããäžéšã®libcïŒç¹ã«glibcïŒã¯ãæ¥å°ŸèŸ_r()
æã€é¢æ°ãšããŠåå
¥å¯èœãªåçã®é¢æ°ãå
¬éããŠããŸãã æ°ããC11æšæºã«ã¯ãã¹ã¬ããã䜿çšããããã®ããå€ãã®ãªãã·ã§ã³ãçšæãããŠããŸãã ãŸããC11 libcã®é¢æ°ãåèšèšãããæ¥å°ŸèŸ_s()
ããšãã°ã localtime_s()
ïŒã
strtok() => strtok_r(); strerror(), strerror_r(); readdir() => readdir_r()
strtok() => strtok_r(); strerror(), strerror_r(); readdir() => readdir_r()
-ãªã©
PHPèªäœã¯ãäž»ã«ã¯ãã¹ãã©ãããã©ãŒã ã§äœ¿çšããããã®ããã€ãã®æ©èœãæäŸããŸãã main / reentrancy.cãèŠãŠãã ãã ã
ãŸããç¬èªã®C颿°ãäœæãããšãã¯ãåå
¥å¯èœæ§ãå¿ããªãã§ãã ããã 颿°ã¯ãå¿
èŠãªãã¹ãŠãåŒæ°ã®åœ¢åŒã§ïŒã¹ã¿ãã¯äžãŸãã¯ã¬ãžã¹ã¿ãä»ããŠïŒæž¡ãããšãã§ããã°ããŒãã«/éç倿°ãŸãã¯åå
¥äžå¯èœãªé¢æ°ã䜿çšããªãå Žåãåå
¥å¯èœã«ãªããŸãã
ã¹ã¬ããã»ãŒãã©ã€ãã©ãªã«æ¥ç¶ããªãã§ãã ãã
ã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ã§ã¯ãã¡ã¢ãªã€ã¡ãŒãžãå
±æããããã»ã¹å
šäœãéèŠã§ããããšãå¿ããªãã§ãã ããã ããã«ã¯ããªã³ã¯ãããã©ã€ãã©ãªãå«ãŸããŸãã
æ¡åŒµæ©èœã確å®ã«ã¹ã¬ããã»ãŒããªã©ã€ãã©ãªã«é¢é£ä»ããããŠããå Žåãã©ã€ãã©ãªãã°ããŒãã«ç¶æ
ã«ã¢ã¯ã»ã¹ããªãããã«ä¿è·ããããã«ãã¹ã¬ããã®å®å
šæ§ã確ä¿ããç¬èªã®æ¹æ³ãéçºããå¿
èŠããããŸãã ã¹ããªãŒãã³ã°ããã°ã©ãã³ã°ãšCã§ã¯ãããã¯é »ç¹ã«çºçããŸãããèŠèœãšãããã¡ã§ãã
ZTSã䜿çšãã
ZTSã¯ãPHP 7ã§TLSïŒã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžïŒã䜿çšããŠã°ããŒãã«ã¹ããªãŒãã³ã°å€æ°ãžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããã³ãŒãã¬ãã«ã§ãã
PHPèšèªãšãã®æ¡åŒµæ©èœãéçºãããšããã³ãŒãå
ã®2ã€ã®ã¿ã€ãã®ã°ããŒãã«ãåºå¥ããå¿
èŠããããŸãã
åçŽãªåŸæ¥ã®ã°ããŒãã«C倿°ã§ããçã®ã°ããŒãã«ããããŸãããããã¯ã¢ãŒããã¯ãã£ã«ã¯åé¡ãããŸããããã¹ã¬ããã®äžè²«æ§ããä¿è·ããªãã£ããããPHPããªã¯ãšã¹ããåŠçãããšãã«ã®ã¿èªã¿åãããšãã§ããŸãã å°ãªããšã1ã€ã®å®è¡ã¹ã¬ãããäœæãããåã« ãçã®ã°ããŒãã«ãäœæããã³æžã蟌ãŸããŸãã PHPã®å
éšçšèªã§ã¯ããã®ã¹ãããã¯ã¢ãžã¥ãŒã«initãšåŒã°ããŸã ã ããã¯ãæ¡åŒµæ©èœã®äŸã§æç¢ºã«èŠãããŸãã
static int val; PHP_MINIT(wow_ext) { if (something()) { val = 3; } }
ãã®æ¬äŒŒã³ãŒãã¯ãPHPæ¡åŒµæ©èœãã©ã®ããã«èŠãããã瀺ããŠããŸãã æ¡åŒµæ©èœã«ã¯ãPHPã©ã€ããµã€ã¯ã«äžã«åæåãããããã€ãã®ããã¯ããããŸãã MINITïŒïŒã€ã³ã¿ãŒã»ãã¿ãŒã¯ãPHPã®åæåãæããŸãã ãã®æé ã䜿çšãããšãPHPãèµ·åããäžèšã®äŸã®ããã«ãã°ããŒãã«å€æ°ãå®å
šã«èªã¿åããŸãã¯æžã蟌ã¿ã§ããŸãã
2çªç®ã®éèŠãªã€ã³ã¿ãŒã»ãã¿ãŒã¯RINITïŒïŒãã€ãŸããªã¯ãšã¹ãã®åæåã§ãã ãã®ããã·ãŒãžã£ã¯ãæ°ãããªã¯ãšã¹ããåŠçããããã³ã«åæ¡åŒµæ©èœã«å¯ŸããŠåŒã³åºãããŸãã ã€ãŸããRINITïŒïŒã¯äœååãæ¡åŒµãšåŒã°ããŸãã ãã®æç¹ã§ã PHPã¯ãã§ã«æµããŠããŸãã WebãµãŒããŒã¯å
ã®ããã»ã¹ãã¹ã¬ããã«åå²ãããã ãRINITïŒïŒã§ã¹ã¬ããã»ãŒããå¿
èŠã§ã ã ããã¯ãè€æ°ã®èŠæ±ãåæã«åŠçããã¹ã¬ãããäœæãããç¶æ³ã§ã¯å®å
šã«è«ççã§ãã ã¹ã¬ãããäœæããŠããªãããšãå¿ããªãã§ãã ãã ã PHPã®ä»£ããã«ãã¹ããªãŒã ã¯WebãµãŒããŒã«ãã£ãŠäœæãããŸãã
ã¹ã¬ããã°ããŒãã«ã䜿çšããŸã ã ãããã¯ãZTSã¬ãã«ã«ãã£ãŠã¹ã¬ããã®å®å
šæ§ã確ä¿ãããŠããã°ããŒãã«å€æ°ã§ãã
PHP_RINIT(wow_ext) { if (something()) { WOW_G(val) = 3; } }
ã¹ããªãŒãã³ã°ã°ããŒãã«ã«ã¢ã¯ã»ã¹ããããã«ã WOW_G()
ãã¯ãã䜿çšãWOW_G()
ã ä»çµã¿ãèŠãŠã¿ãŸãããã
ãã¯ãã®å¿
èŠæ§
èŠç¢ºèªïŒPHPãã¹ã¬ããã§å®è¡ãããå Žåããªã¯ãšã¹ãã«é¢é£ãããã¹ãŠã®ã°ããŒãã«ç¶æ
ãžã®ã¢ã¯ã»ã¹ãä¿è·ããå¿
èŠããããŸãã ã¹ã¬ããããªãå Žåããã®ä¿è·ã¯å¿
èŠãããŸããã çµå±ã®ãšãããåããã»ã¹ã¯ç¬èªã®ã¡ã¢ãªãåãåããä»ã®èª°ãããã䜿çšããŸããã
ãã®ãããã¯ãšãªã«é¢é£ããã°ããŒãã«ã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯ç°å¢ã«ãã£ãŠç°ãªããŸãïŒãã«ãã¿ã¹ã¯ãšã³ãžã³ã䜿çšãããŸãïŒã ãããã£ãŠãç°å¢ã«é¢ä¿ãªããã¯ãšãªã«é¢é£ä»ããããã°ããŒãã«ãžã®ã¢ã¯ã»ã¹ãçããå®è¡ãããããšã確èªããå¿
èŠããããŸãã
ããã«ã¯ãã¯ãã䜿çšãããŸãã
WOW_G()
ãã¯ãã¯ããã«ãã¿ã¹ã¯PHPãšã³ãžã³ïŒããã»ã¹ãŸãã¯ã¹ã¬ããïŒã®äœæ¥ã«å¿ããŠãããŸããŸãªæ¹æ³ã§åŠçãããŸãã æ¡åŒµæ©èœãåã³ã³ãã€ã«ããããšã§ãããã«åœ±é¿ãäžããããšãã§ããŸãã ãããã£ãŠãZTSã¢ãŒããšéZTSã¢ãŒããåãæ¿ããå ŽåãPHPæ¡åŒµã¯äºææ§ããããŸããã ãã€ããªéäºæïŒ
ZTSã¯nonZTSãšãã€ããªäºæã§ã¯ãããŸããã ããã¢ãŒãããå¥ã®ã¢ãŒãã«åãæ¿ããå ŽåãäŸå€ãåã³ã³ãã€ã«ããå¿
èŠããããŸãã
ããã»ã¹ã§äœæ¥ããå Žåã WOW_G()
ãã¯ãã¯é垞次ã®ããã«åŠçãããŸãã
#ifdef ZTS #define WOW_G(v) wow_globals.v #endif
ã¹ããªãŒã ã§äœæ¥ããå ŽåïŒ
#ifndef ZTS #define WOW_G(v) wow_globals.v #else #define WOW_G(v) (((wow_globals *) (*((void ***) tsrm_get_ls_cache()))[((wow_globals_id)-1)])->v) #endif
ZTSã¢ãŒãã§ã¯ããé£ãããªããŸãã
ããã»ã¹ã§äœæ¥ããå Žå-éZTSïŒéZendã¹ã¬ããã»ãŒãïŒã¢ãŒã-çã®ã°ããŒãã«wow_globalsã䜿çšãããŸãã ãã®å€æ°ã¯ãã°ããŒãã«å€æ°ãå«ãæ§é äœã§ããããã¯ãã䜿çšããŠå倿°ãåç
§ããŸãã WOW_G(foo)
ã¯wow_globals.foo
ãŸãã åœç¶ãèµ·åæã«ãªã»ãããããããã«ããã®å€æ°ã宣èšããå¿
èŠããããŸãã ããããã¯ãã䜿çšããŠå®è¡ãããŸãïŒZTSã¢ãŒãã§ã¯ç°ãªãæ¹æ³ã§å®è¡ãããŸãïŒã
ZEND_BEGIN_MODULE_GLOBALS(wow) int foo; ZEND_END_MODULE_GLOBALS(wow) ZEND_DECLARE_MODULE_GLOBALS(wow)
次ã«ããã¯ãã¯æ¬¡ã®ããã«åŠçãããŸãã
#define ZEND_BEGIN_MODULE_GLOBALS(module_name) typedef struct _zend_##module_name##_globals { #define ZEND_END_MODULE_GLOBALS(module_name) } zend_##module_name##_globals; #define ZEND_DECLARE_MODULE_GLOBALS(module_name) zend_##module_name##_globals module_name##_globals;
ããã ãã§ãã ããã»ã¹ã§äœæ¥ããå Žå-è€éãªããšã¯äœããããŸããã
ããããZTSã䜿çšããŠã¹ã¬ããã§äœæ¥ããå Žåãçã®Cã°ããŒãã«ã¯ãããŸããããã°ããŒãã«å®£èšã¯åãããã«èŠããŸãã
#define ZEND_BEGIN_MODULE_GLOBALS(module_name) typedef struct _zend_##module_name##_globals { #define ZEND_END_MODULE_GLOBALS(module_name) } zend_##module_name##_globals; #define WOW_G(v) (((wow_globals *) (*((void ***) tsrm_get_ls_cache()))[((wow_globals_id)-1)])->v)
ZTSããã³nonZTSã§ã¯ãã°ããŒãã«ã¯åãæ¹æ³ã§å®£èšãããŸãã
ããããããããžã®ã¢ã¯ã»ã¹ã¯ç°ãªããŸãã ZTSã§ã¯ã tsrm_get_ls_cache()
颿°ãtsrm_get_ls_cache()
ãŸãã ããã¯ãçŸåšã®ç¹å®ã®å®è¡ã¹ã¬ããã«å²ãåœãŠãããã¡ã¢ãªé åãè¿ãTLSãªããžããªã®åŒã³åºãã§ãã ããããvoidåã«ãã£ã¹ãããŠããããšãèãããšããã®ã³ãŒãã¯ããã»ã©åçŽã§ã¯ãããŸããã
TSRMã¬ãã«
ZTSã¯ãããããTSRMã¬ãã«-ã¹ã¬ããã»ãŒããªãœãŒã¹ãããŒãžã£ãŒã䜿çšããŸãã ããã¯åãªãCã³ãŒãã®äžéšã§ããããã以äžã®ãã®ã§ã¯ãããŸããïŒ
ZTSãæ©èœã§ããã®ã¯TSRMã¬ãã«ã®ãããã§ãã ã»ãšãã©ã®å Žåã PHPãœãŒã¹ã³ãŒãã®/ TSRMãã©ã«ããŒã«ãããŸãã
TSRMã¯çæ³çãªã¬ãã«ã§ã¯ãããŸããã äžè¬ã«ãããã¯é©åã«èšèšãããPHP 5ã®æä»£ïŒ2004幎é ïŒã«ç»å ŽããŸããã TSRMã¯ãGnu Portable ThreadãPosix ThreadsãState ThreadsãWin32 ThreadsãBeThreadsãªã©ãããã€ãã®äœã¬ãã«ã®ã¹ããªãŒã ã©ã€ãã©ãªã§åäœããŸãã æ§æäžã«ç®çã®ã¬ãã«ãéžæã§ããŸãïŒ./configure --with-tsrm-xxxxxïŒã
TSRMã®åæã§ã¯ãpthreadããŒã¹ã®å®è£
ã«ã€ããŠã®ã¿èª¬æããŸãã
ããŠã³ããŒãTSRM
ã¢ãžã¥ãŒã«ã®åæåäžã«PHPãããŒãããããšãããã«tsrm_startup()
ãtsrm_startup()
ãŸãã PHPã¯ãäœæããã¹ã¬ããã®æ°ãšãã¹ã¬ããã®å®å
šæ§ã確ä¿ããããã«å¿
èŠãªãªãœãŒã¹ã®æ°ããŸã èªèããŠããŸããã ãããã1ã€ã®èŠçŽ ã§æ§æãããã¹ã¬ããããŒãã«ãæºåããŸãã ããŒãã«ã¯åŸã§å€§ãããªããŸãããçŸæç¹ã§ã¯malloc()
ã䜿çšããŠé
åžãããŸãã
ãã®åææ®µéãéèŠã§ããããã§ã¯ãTLSããŒãšTLSãã¥ãŒããã¯ã¹ãäœæããŸãããããã¯åæããå¿
èŠããããŸãã
static pthread_key_t tls_key; TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename) { pthread_key_create( &tls_key, 0 ); tsrm_error_file = stderr; tsrm_error_set(debug_level, debug_filename); tsrm_tls_table_size = expected_threads; tsrm_tls_table = (tsrm_tls_entry **) calloc(tsrm_tls_table_size, sizeof(tsrm_tls_entry *)); if (!tsrm_tls_table) { TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate TLS table")); return 0; } id_count=0; resource_types_table_size = expected_resources; resource_types_table = (tsrm_resource_type *) calloc(resource_types_table_size, sizeof(tsrm_resource_type)); if (!resource_types_table) { TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate resource types table")); free(tsrm_tls_table); tsrm_tls_table = NULL; return 0; } tsmm_mutex = tsrm_mutex_alloc(); } #define MUTEX_T pthread_mutex_t * TSRM_API MUTEX_T tsrm_mutex_alloc(void) { MUTEX_T mutexp; mutexp = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(mutexp,NULL); return mutexp; }
TSRMãªãœãŒã¹
TSRMã¬ã€ã€ãŒãèªã¿èŸŒãŸããããæ°ãããªãœãŒã¹ã远å ããå¿
èŠããããŸãã ãªãœãŒã¹ã¯ãéåžžPHPæ¡åŒµã«é¢é£ããã°ããŒãã«å€æ°ã®ã»ãããå«ãã¡ã¢ãªé åã§ãã ãªãœãŒã¹ã¯çŸåšã®å®è¡ã¹ã¬ããã«å±ããŠããããã¢ã¯ã»ã¹ã«å¯ŸããŠä¿è·ãããŠããå¿
èŠããããŸãã
ãã®ã¡ã¢ãªé åã«ã¯ããçšåºŠã®ãµã€ãºããããŸãã 圌女ã¯åæåïŒã³ã³ã¹ãã©ã¯ã¿ãŒïŒãšåæåè§£é€ïŒãã¹ãã©ã¯ã¿ãŒïŒãå¿
èŠã§ãã éåžžãåæåã¯ã¡ã¢ãªé åã®ãŒãåã«éå®ãããåæåè§£é€äžã¯äœãè¡ãããŸããã
TSRMã¬ã€ã€ãŒã¯ããªãœãŒã¹ã«äžæã®IDãæäŸããŸãã ãã®åŸãTSRMããä¿è·ãããã¡ã¢ãªé åãè¿ãããã«åŸã§å¿
èŠã«ãªããããåŒã³åºãå
ã¯ãã®IDãä¿åããå¿
èŠããããŸãã
æ°ãããªãœãŒã¹ãäœæããTSRMæ©èœïŒ
typedef struct { size_t size; ts_allocate_ctor ctor; ts_allocate_dtor dtor; int done; } tsrm_resource_type; TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor) { int i; tsrm_mutex_lock(tsmm_mutex); *rsrc_id = id_count++; if (resource_types_table_size < id_count) { resource_types_table = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count); if (!resource_types_table) { tsrm_mutex_unlock(tsmm_mutex); TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate storage for resource")); *rsrc_id = 0; return 0; } resource_types_table_size = id_count; } resource_types_table[(*rsrc_id)-1].size = size; resource_types_table[(*rsrc_id)-1].ctor = ctor; resource_types_table[(*rsrc_id)-1].dtor = dtor; resource_types_table[(*rsrc_id)-1].done = 0; for (i=0; icount < id_count) { int j; p->storage = (void *) realloc(p->storage, sizeof(void *)*id_count); for (j=p->count; jstorage[j] = (void *) malloc(resource_types_table[j].size); if (resource_types_table[j].ctor) { resource_types_table[j].ctor(p->storage[j]); } } p->count = id_count; } p = p->next; } } tsrm_mutex_unlock(tsmm_mutex); return *rsrc_id; }
ã芧ã®ãšããããã®é¢æ°ã«ã¯çžäºæä»ããã¯ïŒçžäºæä»ããã¯ïŒãå¿
èŠã§ãã å®è¡ã®åã¹ã¬ããã§åŒã³åºãããå ŽåïŒããã³ããããã®ã¹ã¬ããã§åŒã³åºãããå ŽåïŒãã°ããŒãã«ã¹ã¬ããã¹ãã¬ãŒãžç¶æ
ã®æäœãå®äºãããŸã§ä»ã®ã¹ã¬ããããããã¯ããŸãã
æ°ãããªãœãŒã¹ã¯åçé
åresource_types_table[]
远å ãããäžæã®èå¥årsrc_id
ãååŸããŸããããã¯ããªãœãŒã¹ã远å ããããšå¢åãããŸãã
å®è¡äžã®ãªã¯ãšã¹ã
ããã§ããªã¯ãšã¹ããåŠçããæºåãã§ããŸããã åãªã¯ãšã¹ãã¯ãç¬èªã®å®è¡ã¹ã¬ããã§åŠçãããããšã«æ³šæããŠãã ããã ãªã¯ãšã¹ãã衚瀺ããããšã©ããªããŸããïŒ åæ°ãããªã¯ãšã¹ãã®æåã«ã ts_resource_ex()
颿°ãts_resource_ex()
ãŸãã çŸåšã®å®è¡ã¹ã¬ããã®IDãèªã¿åãããã®ã¹ã¬ããã«å²ãåœãŠããããªãœãŒã¹ãã€ãŸãçŸåšã®ã¹ã¬ããã®ã°ããŒãã«ã®ã¡ã¢ãªé åãæœåºããããšããŸãã ãªãœãŒã¹ãæ€åºãããªãå ŽåïŒã¹ããªãŒã ã¯æ°ããïŒããªãœãŒã¹ã¯PHPã®èµ·åæã«äœæãããã¢ãã«ã«åºã¥ããŠçŸåšã®ã¹ããªãŒã ã«å²ãåœãŠãããŸãã ããã¯allocate_new_resource()
ã䜿çšããŠè¡ãããŸã
static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_T thread_id) { int i; TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Creating data structures for thread %x", thread_id)); (*thread_resources_ptr) = (tsrm_tls_entry *) malloc(sizeof(tsrm_tls_entry)); (*thread_resources_ptr)->storage = NULL; if (id_count > 0) { (*thread_resources_ptr)->storage = (void **) malloc(sizeof(void *)*id_count); } (*thread_resources_ptr)->count = id_count; (*thread_resources_ptr)->thread_id = thread_id; (*thread_resources_ptr)->next = NULL; tsrm_tls_set(*thread_resources_ptr); if (tsrm_new_thread_begin_handler) { tsrm_new_thread_begin_handler(thread_id); } for (i=0; istorage[i] = NULL; } else { (*thread_resources_ptr)->storage[i] = (void *) malloc(resource_types_table[i].size); if (resource_types_table[i].ctor) { resource_types_table[i].ctor((*thread_resources_ptr)->storage[i]); } } } if (tsrm_new_thread_end_handler) { tsrm_new_thread_end_handler(thread_id); } tsrm_mutex_unlock(tsmm_mutex); }
æ¡åŒµããŒã«ã«ã¹ãã¬ãŒãžãã£ãã·ã¥
PHP 7ã®åæ¡åŒµæ©èœã¯ãããŒã«ã«ã¹ãã¬ãŒãžã§ãã£ãã·ã¥ã宣èšã§ããŸãã ããã¯ãæ°ããå®è¡ã¹ã¬ãããéå§ãããã³ã«ãåæ¡åŒµæ©èœãç¬èªã®å®è¡ã¹ã¬ããã®ããŒã«ã«ã¹ãã¬ãŒãžé åãèªã¿åããã°ããŒãã«ã¢ã¯ã»ã¹ã«ã¢ã¯ã»ã¹ãããã³ã«ãªããžããªã®ãªã¹ããå埩åŠçããªãããšãæå³ããŸãã éæ³ã¯ãããŸãããããã«ã¯ããã€ãã®ããšãããå¿
èŠããããŸãã
æåã«ããã£ãã·ã¥ããµããŒãããŠPHPãã³ã³ãã€ã«ããå¿
èŠããããŸããã³ã³ãã€ã«ã³ãã³ãã©ã€ã³ã§ã -DZEND_ENABLE_STATIC_TSRMLS_CACHE = 1ãšå
¥åããŸãã ãããã«ãããããã¯ããã©ã«ãã§è¡ãããã¹ãã§ãã æ¬¡ã«ãæ¡åŒµæ©èœã®ã°ããŒãã«ã宣èšãããšãã«ããã¯ãZEND_TSRMLS_CACHE_DEFINE()
䜿çšããŸãã
#define ZEND_TSRMLS_CACHE_DEFINE(); __thread void *_tsrm_ls_cache = ((void *)0);
ã芧ã®ãšãããçã®Cã°ããŒãã«ã¯ãç¹å¥ãª__thread
ã§ã®ã¿__thread
ãŸãã ããã¯ãã¹ã¬ããåºæã®å€æ°ã«ãªãããšãã³ã³ãã€ã©ãŒã«äŒããããã§ãã
次ã«ããã®void *ãªããžããªã«ãTSRMã¬ãã«ã§ã°ããŒãã«çšã«äºçŽããããªããžããªã®ããŒã¿ãå
¥åããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãã°ããŒãã«ã³ã³ã¹ãã©ã¯ã¿ãŒã§ZEND_TSRMLS_CACHE_UPDATE()
ã䜿çšã§ããŸãã
PHP_GINIT_FUNCTION(my_ext) { #ifdef ZTS ZEND_TSRMLS_CACHE_UPDATE(); #endif } ```cpp (macro expansion): ```#define ZEND_TSRMLS_CACHE_UPDATE() _tsrm_ls_cache = tsrm_get_ls_cache();``` pthread: ```#define tsrm_get_ls_cache pthread_getspecific(tls_key)``` , , â : ```cpp #ifdef ZTS #define MY_G(v) (((my_globals *) (*((void ***) _tsrm_ls_cache))[((my_globals_id)-1)])->(v))
ã芧ã®ãšãããMY_GïŒïŒãã¯ãã䜿çšããŠã°ããŒãã«ã«ã¢ã¯ã»ã¹ãããšãã¹ããªãŒã ç°å¢ã䜿çšããŠãããšãã«æ¡åŒµããããã®æ¡åŒµæ©èœã®ID _tsrm_ls_cache
ã䜿çšããŠ_tsrm_ls_cache
é åããã§ãã¯ããŸãã

ãããŸã§èŠãŠããããã«ãåæ¡åŒµæ©èœã¯ãªãœãŒã¹ã§ããããã®ã°ããŒãã«çšã®ã¹ããŒã¹ãæäŸããŸãã ID. TSRM , /.
ãããã«
â . , PHP : TLS, , â TSRM. , , . , PHP .
TSRM: -, , . , ZTS, . TSRM : , , .
, , (request-bound). - -, , servinf : , , -.