ÕªÒª£ºPHPÒѾ×ß¹ýÁË20ÄêµÄÀúÊ·£¬Ö±µ½½ñÌ죬PHP7¶¼·¢²¼ÁËRC°æ£¬¾Ý˵£¬PHP7Õýʽ°æÓ¦¸Ã»áÔÚ2015Äê11Ô·Ý×óÓÒ·¢²¼¡£PHP7¶ÔÓÚÉÏÒ»¸öϵÁеÄPHP5.*£¬¿ÉÒÔ˵ÊÇÒ»¸ö´ó¹æÄ£µÄ¸ïУ¬ÓÈÆäÊÇÔÚÐÔÄÜ·½ÃæÊµÏÖ¿çԽʽµÄ´ó·ùÌáÉý¡£

ÓÐÐÒ²ÎÓë2015ÄêµÄPHP¼¼Êõ·å»á£¨PHPCON£©£¬ÌýÁËÄñ¸ç£¨»ÝÐÂå·£©µÄ¹ØÓÚPHP7µÄÐÂÌØÐÔºÍÐÔÄÜÓÅ»¯µÄ·ÖÏí£¬Ò»Çж¼ÁîÈ˸е½¼¤¶¯¡£Äñ¸çÊǹúÄÚ×îȨÍþµÄPHPר¼Ò£¬ËûµÄ·ÖÏíÓкܶà·Ç³£ÓмÛÖµµÄ¶«Î÷£¬ÎÒͨ¹ýÕûÀí·ÖÏíµÄPPTºÍÊÕ¼¯Ïà¹Ø×ÊÁÏ£¬ÕûÀíΪÕâÆª½â¶ÁÐÔÖʵļ¼ÊõÎÄÕ£¬Ï£ÍûÄܸø×öPHP¿ª·¢µÄͬѧһЩ°ïÖú¡£
PHPÒѾ×ß¹ýÁË20ÄêµÄÀúÊ·£¬Ö±µ½½ñÌ죬PHP7¶¼·¢²¼ÁËRC°æ£¬¾Ý˵£¬PHP7Õýʽ°æÓ¦¸Ã»áÔÚ2015Äê11Ô·Ý×óÓÒ·¢²¼¡£PHP7¶ÔÓÚÉÏÒ»¸öϵÁеÄPHP5.*£¬¿ÉÒÔ˵ÊÇÒ»¸ö´ó¹æÄ£µÄ¸ïУ¬ÓÈÆäÊÇÔÚÐÔÄÜ·½ÃæÊµÏÖ¿çԽʽµÄ´ó·ùÌáÉý¡£
PHPÊÇÒ»ÖÖÔÚÈ«Çò·¶Î§ÄÚ±»¹ã·ºÊ¹ÓõÄWeb¿ª·¢ÓïÑÔ£¬PHP7µÄ¸ïÐÂÒ²µ±È»»á¸øÕâЩWeb·þÎñ´øÀ´¸üÉî¿ÌµÄ±ä»¯¡£ÕâÀïÒýÓÃÄñ¸çPPTÖеÄÒ»¸öͼ±í£¨82%µÄWebÕ¾µãÓÐʹÓÃPHP×÷Ϊ¿ª·¢ÓïÑÔ£©£º

£¨×¢£ºÒ»¸öwebÕ¾µã¿ÉÒÔ»áʹÓöàÖÖÓïÑÔ×÷ΪËüµÄ¿ª·¢ÓïÑÔ£©
£¨×¢£º±¾Îĺ¬Óв»ÉÙ´ÓÄñ¸çPPTÀïµÄ½ØÍ¼£¬Í¼Æ¬°æÈ¨¹éÄñ¸çËùÓУ©
ÎÒÃÇÏÈ¿´¿´Á½Õż¤¶¯ÈËÐĵÄÐÔÄܲâÊÔ½á¹ûͼ£º
Benchmark¶Ô±È£¨Í¼Æ¬À´×ÔÓÚPPT£©£º

PHP7µÄÐÔÄܲâÊÔ½á¹û£¬ÐÔÄÜѹ²â½á¹û£¬ºÄʱ´Ó2.991Ͻµµ½1.186£¬´ó·ù¶ÈϽµ60%¡£
WordPressµÄQPSѹ²â£¨Í¼Æ¬À´×ÔÓÚPPT£©£º

¶øÔÚWordPressÏîÄ¿ÖУ¬PHP7¶Ô±ÈPHP5.6£¬QPSÌáÉý2.77±¶¡£
¿´ÍêÁîÈ˼¤¶¯µÄÐÔÄܲâÊÔ½á¹û¶Ô±È£¬ÎÒÃǾͽøÈëÕýÌâ¹þ¡£PHP7µÄÐÂÔöÌØÐԺܶ࣬²»¹ý£¬ÎÒÃÇ»á¸ü¾Û½¹ÓÚÄÇЩÖ÷ÒªµÄ±ä»¯¡£
Ò»¡¢ÐÂÔöÌØÐԺ͸ıä
1. ±êÁ¿ÀàÐͺͷµ»ØÀàÐÍÉùÃ÷£¨Scalar Type Declarations & Scalar Type Declarations£©
PHPÓïÑÔÒ»¸ö·Ç³£ÖØÒªµÄÌØµã¾ÍÊÇ¡°ÈõÀàÐÍ¡±£¬ËüÈÃPHPµÄ³ÌÐò±äµÃ·Ç³£ÈÝÒ×±àд£¬ÐÂÊÖ½Ó´¥PHPÄܹ»¿ìËÙÉÏÊÖ£¬²»¹ý£¬ËüÒ²°éËæ×ÅһЩÕùÒé¡£Ö§³Ö±äÁ¿ÀàÐ͵͍Ò壬¿ÉÒÔ˵ÊǸïÐÂÐÔÖʵı仯£¬PHP¿ªÊ¼ÒÔ¿ÉÑ¡µÄ·½Ê½Ö§³ÖÀàÐͶ¨Òå¡£³ý´ËÖ®Í⣬»¹ÒýÈëÁËÒ»¸ö¿ª¹ØÖ¸Áîdeclare(strict_type=1);£¬µ±Õâ¸öÖ¸ÁîÒ»µ©¿ªÆô£¬½«»áÇ¿ÖÆµ±Ç°ÎļþϵijÌÐò×ñÑÑϸñµÄº¯Êý´«²ÎÀàÐͺͷµ»ØÀàÐÍ¡£
ÀýÈçÒ»¸öaddº¯Êý¼ÓÉÏÀàÐͶ¨Ò壬¿ÉÒÔд³ÉÕâÑù£º

Èç¹ûÅäºÏÇ¿ÖÆÀàÐÍ¿ª¹ØÖ¸ÁÔò¿ÉÒÔ±äΪÕâÑù£º

Èç¹û²»¿ªÆôstrict_type£¬PHP½«»á³¢ÊÔ°ïÄãת»»³ÉÒªÇóµÄÀàÐÍ£¬¶ø¿ªÆôÖ®ºó£¬»á¸Ä±äPHP¾Í²»ÔÙ×öÀàÐÍת»»£¬ÀàÐͲ»Æ¥Åä¾Í»áÅ׳ö´íÎó¡£¶ÔÓÚϲ»¶¡°Ç¿ÀàÐÍ¡±ÓïÑÔµÄͬѧÀ´Ëµ£¬ÕâÊÇÒ»´ó¸£Òô¡£
¸üΪÏêϸµÄ½éÉÜ£ºPHP7±êÁ¿ÀàÐÍÉùÃ÷RFC[·Òë>
2. ¸ü¶àµÄError±äΪ¿É²¶»ñµÄException
PHP7ʵÏÖÁËÒ»¸öÈ«¾ÖµÄthrowable½Ó¿Ú£¬ÔÀ´µÄExceptionºÍ²¿·ÖError¶¼ÊµÏÖÁËÕâ¸ö½Ó¿Ú£¨interface£©£¬ ÒԽӿڵķ½Ê½¶¨ÒåÁËÒì³£µÄ¼Ì³Ð½á¹¹¡£ÓÚÊÇ£¬PHP7Öиü¶àµÄError±äΪ¿É²¶»ñµÄException·µ»Ø¸ø¿ª·¢Õߣ¬Èç¹û²»½øÐв¶»ñÔòΪError£¬Èç¹û²¶»ñ¾Í±äΪһ¸ö¿ÉÔÚ³ÌÐòÄÚ´¦ÀíµÄException¡£ÕâЩ¿É±»²¶»ñµÄErrorͨ³£¶¼ÊDz»»á¶Ô³ÌÐòÔì³ÉÖÂÃüÉ˺¦µÄError£¬ÀýÈ纯Êý²»´æ¡£PHP7½øÒ»²½·½±ã¿ª·¢Õß´¦Àí£¬Èÿª·¢Õß¶Ô³ÌÐòµÄÕÆ¿ØÄÜÁ¦¸üÇ¿¡£ÒòΪÔÚĬÈÏÇé¿öÏ£¬Error»áÖ±½Óµ¼Ö³ÌÐòÖжϣ¬¶øPHP7ÔòÌṩ²¶»ñ²¢ÇÒ´¦ÀíµÄÄÜÁ¦£¬ÈóÌÐò¼ÌÐøÖ´ÐÐÏÂÈ¥£¬Îª³ÌÐòÔ±Ìṩ¸üÁé»îµÄÑ¡Ôñ¡£
ÀýÈ磬ִÐÐÒ»¸öÎÒÃDz»È·¶¨ÊÇ·ñ´æÔڵĺ¯Êý£¬PHP5¼æÈݵÄ×ö·¨ÊÇÔÚº¯Êý±»µ÷ÓÃ֮ǰ׷¼ÓµÄÅжÏfunction_exist£¬¶øPHP7ÔòÖ§³Ö²¶»ñExceptionµÄ´¦Àí·½Ê½¡£
ÈçÏÂͼÖеÄÀý×Ó£¨½ØÍ¼À´Ô´ÓÚPPTÄÚ£©£º

3. AST£¨Abstract Syntax Tree£¬³éÏóÓï·¨Ê÷£©
ASTÔÚPHP±àÒë¹ý³Ì×÷Ϊһ¸öÖмä¼þµÄ½ÇÉ«£¬Ìæ»»ÔÀ´Ö±½Ó´Ó½âÊÍÆ÷ͳöopcodeµÄ·½Ê½£¬ÈýâÊÍÆ÷£¨parser£©ºÍ±àÒëÆ÷£¨compliler£©½âñ¿ÉÒÔ¼õÉÙһЩHack´úÂ룬ͬʱ£¬ÈÃʵÏÖ¸üÈÝÒ×Àí½âºÍ¿Éά»¤¡£
PHP 5£º

PHP 7£º

¸ü¶àASTÐÅÏ¢£ºhttps://wiki.php.net/rfc/abstract_syntax_tree
4. Native TLS£¨Native Thread local storage£¬ÔÉúÏ̱߳¾µØ´æ´¢£©
PHPÔÚ¶àÏß³ÌģʽÏ£¨ÀýÈ磬Web·þÎñÆ÷ApacheµÄwokerºÍeventģʽ£¬¾ÍÊǶàỊ̈߳©£¬ÐèÒª½â¾ö¡°Ḭ̈߳²È«¡±£¨TS£¬Thread Safe£©µÄÎÊÌ⣬ÒòΪÏß³ÌÊǹ²Ïí½ø³ÌµÄÄÚ´æ¿Õ¼äµÄ£¬ËùÒÔÿ¸öÏ̱߳¾ÉíÐèҪͨ¹ýijÖÖ·½Ê½£¬¹¹½¨Ë½ÓеĿռäÀ´±£´æ×Ô¼ºµÄ˽ÓÐÊý¾Ý£¬±ÜÃâºÍÆäËûÏß³ÌÏ໥ÎÛȾ¡£¶øPHP5²ÉÓõķ½Ê½£¬¾ÍÊÇά»¤Ò»¸öÈ«¾Ö´óÊý×飬Ϊÿһ¸öÏ̷߳ÖÅäÒ»·Ý¶ÀÁ¢µÄ´æ´¢¿Õ¼ä£¬Ïß³Ìͨ¹ý¸÷×ÔÓµÓеÄkeyÖµÀ´·ÃÎÊÕâ¸öÈ«¾ÖÊý¾Ý×é¡£
¶øÕâ¸ö¶ÀÓеÄkeyÖµÔÚPHP5ÖÐÐèÒª´«µÝ¸øÃ¿Ò»¸öÐèÒªÓõ½È«¾Ö±äÁ¿µÄº¯Êý£¬PHP7ÈÏΪÕâÖÖ´«µÝµÄ·½Ê½²¢²»ÓѺ㬲¢ÇÒ´æÔÚһЩÎÊÌâ¡£Òò¶ø£¬³¢ÊÔ²ÉÓÃÒ»¸öÈ«¾ÖµÄÏß³ÌÌØ¶¨±äÁ¿À´±£´æÕâ¸ökeyÖµ¡£
Ïà¹ØµÄNative TLSÎÊÌ⣺https://wiki.php.net/rfc/native-tls
5. ÆäËûÐÂÌØÐÔ
PHP 7ÐÂÌØÐԺͱ仯²»ÉÙ£¬ÎÒÃÇÕâÀï²¢²»È«²¿Õ¹¿ªÀ´Ï¸Ëµ¹þ¡£
- Int64Ö§³Ö£¬Í³Ò»²»Í¬Æ½Ì¨ÏµÄÕûÐͳ¤¶È£¬×Ö·û´®ºÍÎļþÉÏ´«¶¼Ö§³Ö´óÓÚ2GB¡£
-
ͳһ±äÁ¿Óï·¨£¨Uniform variable syntax£©¡£
-
foreach±íÏÖÐÐΪһÖ£¨Consistently foreach behaviors£©
-
еIJÙ×÷·û <=>, ??
-
Unicode×Ö·û¸ñʽ֧³Ö£¨\u{xxxxx}£©
-
ÄäÃûÀàÖ§³Ö£¨Anonymous Class£©
-
¡¡
¶þ¡¢¿çԽʽµÄÐÔÄÜÍ»ÆÆ£ºÈ«ËÙǰ½ø
1. JITÓëÐÔÄÜ
Just In Time£¨¼´Ê±±àÒ룩ÊÇÒ»ÖÖÈí¼þÓÅ»¯¼¼Êõ£¬Ö¸ÔÚÔËÐÐʱ²Å»áÈ¥±àÒë×Ö½ÚÂëΪ»úÆ÷Âë¡£´ÓÖ±¾õ³ö·¢£¬ÎÒÃǶ¼ºÜÈÝÒ×ÈÏΪ£¬»úÆ÷ÂëÊǼÆËã»úÄܹ»Ö±½Óʶ±ðºÍÖ´Ðеģ¬±ÈÆðZend¶ÁÈ¡opcodeÖðÌõÖ´ÐÐЧÂÊ»á¸ü¸ß¡£ÆäÖУ¬HHVM£¨HipHop Virtual Machine£¬HHVMÊÇÒ»¸öFacebook¿ªÔ´µÄPHPÐéÄâ»ú£©¾Í²ÉÓÃJIT£¬ÈÃËûÃǵÄPHPÐÔÄܲâÊÔÌáÉýÁËÒ»¸öÊýÁ¿¼¶£¬·Å³öÒ»¸öÁîÈËÕ𾪵IJâÊÔ½á¹û£¬Ò²ÈÃÎÒÃÇÖ±¹ÛµØÈÏΪJITÊÇÒ»Ïîµãʯ³É½ðµÄÇ¿´ó¼¼Êõ¡£
¶øÊµ¼ÊÉÏ£¬ÔÚ2013ÄêµÄʱºò£¬Äñ¸çºÍDmitry£¨PHPÓïÑÔÄں˿ª·¢ÕßÖ®Ò»£©¾ÍÔø¾ÔÚPHP5.5µÄ°æ±¾ÉÏ×ö¹ýÒ»¸öJITµÄ³¢ÊÔ£¨²¢Ã»Óз¢²¼£©¡£PHP5.5µÄÔÀ´µÄÖ´ÐÐÁ÷³Ì£¬Êǽ«PHP´úÂëͨ¹ý´Ê·¨ºÍÓï·¨·ÖÎö£¬±àÒë³Éopcode×Ö½ÚÂ루¸ñʽºÍ»ã±àÓеãÏñ£©£¬È»ºó£¬ZendÒýÇæ¶ÁÈ¡ÕâЩopcodeÖ¸ÁÖðÌõ½âÎöÖ´ÐС£

¶øËûÃÇÔÚopcode»·½ÚºóÒýÈëÁËÀàÐÍÍÆ¶Ï£¨TypeInf£©£¬È»ºóͨ¹ýJITÉú³ÉByteCodes£¬È»ºóÔÙÖ´ÐС£

ÓÚÊÇ£¬ÔÚbenchmark£¨²âÊÔ³ÌÐò£©Öеõ½ÁîÈËÐ˷ܵĽá¹û£¬ÊµÏÖJITºóÐÔÄܱÈPHP5.5ÌáÉýÁË8±¶¡£È»¶ø£¬µ±ËûÃǰÑÕâ¸öÓÅ»¯·ÅÈ뵽ʵ¼ÊµÄÏîÄ¿WordPress£¨Ò»¸ö¿ªÔ´²©¿ÍÏîÄ¿£©ÖУ¬È´¼¸ºõ¿´²»¼ûÐÔÄܵÄÌáÉý£¬µÃµ½ÁËÒ»¸öÁîÈ˷ѽâµÄ²âÊÔ½á¹û¡£
ÓÚÊÇ£¬ËûÃÇʹÓÃLinuxϵÄprofileÀàÐ͹¤¾ß£¬¶Ô³ÌÐòÖ´ÐнøÐÐCPUºÄʱռÓ÷ÖÎö¡£
Ö´ÐÐ100´ÎWordPressµÄCPUÏûºÄµÄ·Ö²¼£¨½ØÍ¼À´×ÔPPT£©£º

×¢½â£º
21%CPUʱ¼ä»¨·ÑÔÚÄÚ´æ¹ÜÀí¡£
12%CPUʱ¼ä»¨·ÑÔÚhash table²Ù×÷£¬Ö÷ÒªÊÇPHPÊý×éµÄÔöɾ¸Ä²é¡£
30%CPUʱ¼ä»¨·ÑÔÚÄÚÖú¯Êý£¬ÀýÈçstrlen¡£
25%CPUʱ¼ä»¨·ÑÔÚVM£¨ZendÒýÇæ£©¡£
¾¹ý·ÖÎöÖ®ºó£¬µÃµ½ÁËÁ½¸ö½áÂÛ£º
£¨1£©JITÉú³ÉµÄByteCodesÈç¹ûÌ«´ó£¬»áÒýÆðCPU»º´æÃüÖÐÂÊϽµ£¨CPU Cache Miss£©
ÔÚPHP5.5µÄ´úÂëÀÒòΪ²¢Ã»ÓÐÃ÷ÏÔÀàÐͶ¨Ò壬ֻÄÜ¿¿ÀàÐÍÍÆ¶Ï¡£¾¡¿ÉÄܽ«¿ÉÒÔÍÆ¶Ï³öÀ´µÄ±äÁ¿ÀàÐÍ£¬¶¨Òå³öÀ´£¬È»ºó£¬½áºÏÀàÐÍÍÆ¶Ï£¬½«·Ç¸ÃÀàÐ͵ķÖÖ§´úÂëÈ¥µô£¬Éú³ÉÖ±½Ó¿ÉÖ´ÐеĻúÆ÷Â롣Ȼ¶ø£¬ÀàÐÍÍÆ¶Ï²»ÄÜÍÆ¶Ï³öÈ«²¿ÀàÐÍ£¬ÔÚWordPressÖУ¬Äܹ»ÍƶϳöÀ´µÄÀàÐÍÐÅÏ¢Ö»Óв»µ½30%£¬Äܹ»¼õÉٵķÖÖ§´úÂëÓÐÏÞ¡£µ¼ÖÂJITÒÔºó£¬Ö±½ÓÉú³É»úÆ÷Â룬Éú³ÉµÄByteCodesÌ«´ó£¬×îÖÕÒýÆðCPU»º´æÃüÖдó·ù¶ÈϽµ£¨CPU Cache Miss£©¡£
CPU»º´æÃüÖÐÊÇÖ¸£¬CPUÔÚ¶ÁÈ¡²¢Ö´ÐÐÖ¸ÁîµÄ¹ý³ÌÖУ¬Èç¹ûÐèÒªµÄÊý¾ÝÔÚCPUÒ»¼¶»º´æ£¨L1£©ÖжÁÈ¡²»µ½£¬¾Í²»µÃ²»ÍùϼÌÐøÑ°ÕÒ£¬Ò»Ö±µ½¶þ¼¶»º´æ£¨L2£©ºÍÈý¼¶»º´æ£¨L3£©£¬×îÖջ᳢ÊÔµ½ÄÚ´æÇøÓòÀïѰÕÒËùÐèÒªµÄÖ¸ÁîÊý¾Ý£¬¶øÄÚ´æºÍCPU»º´æÖ®¼äµÄ¶ÁÈ¡ºÄʱ²î¾à¿ÉÒÔ´ïµ½100±¶¼¶±ð¡£ËùÒÔ£¬ByteCodesÈç¹û¹ý´ó£¬Ö´ÐÐÖ¸ÁîÊýÁ¿¹ý¶à£¬µ¼Ö¶༶»º´æÎÞ·¨ÈÝÄÉÈç´ËÖ®¶àµÄÊý¾Ý£¬²¿·ÖÖ¸Á²»µÃ²»±»´æ·Åµ½ÄÚ´æÇøÓò¡£

CPUµÄ¸÷¼¶»º´æµÄ´óСҲÊÇÓÐÏ޵ģ¬ÏÂͼÊÇIntel i7 920µÄÅäÖÃÐÅÏ¢£º

Òò´Ë£¬CPU»º´æÃüÖÐÂÊϽµ»á´øÀ´ÑÏÖØµÄºÄʱÔö¼Ó£¬ÁíÒ»·½Ã棬JIT´øÀ´µÄÐÔÄÜÌáÉý£¬Ò²±»ËüËùµÖÏûµôÁË¡£
ͨ¹ýJIT£¬¿ÉÒÔ½µµÍVMµÄ¿ªÏú£¬Í¬Ê±£¬Í¨¹ýÖ¸ÁîÓÅ»¯£¬¿ÉÒÔ¼ä½Ó½µµÍÄÚ´æ¹ÜÀíµÄ¿ª·¢£¬ÒòΪ¿ÉÒÔ¼õÉÙÄÚ´æ·ÖÅäµÄ´ÎÊý¡£È»¶ø£¬¶ÔÓÚÕæÊµµÄWordPressÏîÄ¿À´Ëµ£¬CPUºÄʱֻÓÐ25%ÔÚVMÉÏ£¬Ö÷ÒªµÄÎÊÌâºÍÆ¿¾±Êµ¼ÊÉϲ¢²»ÔÚVMÉÏ¡£Òò´Ë£¬JITµÄÓÅ»¯¼Æ»®£¬×îºóûÓб»ÁÐÈë¸Ã°æ±¾µÄPHP7ÌØÐÔÖС£²»¹ý£¬ËüºÜ¿ÉÄÜ»áÔÚ¸üºóÃæµÄ°æ±¾ÖÐʵÏÖ£¬ÕâµãÒ²·Ç³£ÖµµÃÎÒÃÇÆÚ´ý¹þ¡£
£¨2£©JITÐÔÄܵÄÌáÉýЧ¹ûÈ¡¾öÓÚÏîÄ¿µÄʵ¼ÊÆ¿¾±
JITÔÚbenchmarkÖÐÓдó·ù¶ÈµÄÌáÉý£¬ÊÇÒòΪ´úÂëÁ¿±È½ÏÉÙ£¬×îÖÕÉú³ÉµÄByteCodesÒ²±È½ÏС£¬Í¬Ê±Ö÷ÒªµÄ¿ªÏúÊÇÔÚVMÖС£¶øÓ¦ÓÃÔÚWordPressʵ¼ÊÏîÄ¿Öв¢Ã»ÓÐÃ÷ÏÔµÄÐÔÄÜÌáÉý£¬ÔÒòWordPressµÄ´úÂëÁ¿Òª±Èbenchmark´óµÃ¶à£¬ËäÈ»JIT½µµÍÁËVMµÄ¿ªÏú£¬µ«ÊÇÒòΪByteCodesÌ«´ó¶øÓÖÒýÆðCPU»º´æÃüÖÐϽµºÍ¶îÍâµÄÄڴ濪Ïú£¬×îÖÕ±ä³ÉûÓÐÌáÉý¡£
²»Í¬ÀàÐ͵ÄÏîÄ¿»áÓв»Í¬µÄCPU¿ªÏú±ÈÀý£¬Ò²»áµÃµ½²»Í¬µÄ½á¹û£¬ÍÑÀëʵ¼ÊÏîÄ¿µÄÐÔÄܲâÊÔ£¬²¢²»¾ßÓкܺõĴú±íÐÔ¡£
2. ZvalµÄ¸Ä±ä
PHPµÄ¸÷ÖÖÀàÐ͵ıäÁ¿£¬Æäʵ£¬ÕæÕý´æ´¢µÄÔØÌå¾ÍÊÇZval£¬ËüÌØµãÊǺ£Äɰٴ¨£¬ÓÐÈÝÄË´ó¡£´Ó±¾ÖÊÉÏ¿´£¬ËüÊÇCÓïÑÔʵÏÖµÄÒ»¸ö½á¹¹Ì壨struct£©¡£¶ÔÓÚдPHPµÄͬѧ£¬¿ÉÒÔ½«Ëü´ÖÂÔÀí½âΪÊÇÒ»¸öÀàËÆarrayÊý×éµÄ¶«Î÷¡£
PHP5µÄZval£¬ÄÚ´æÕ¼¾Ý24¸ö×Ö½Ú£¨½ØÍ¼À´×ÔPPT£©£º

PHP7µÄZval£¬ÄÚ´æÕ¼¾Ý16¸ö×Ö½Ú£¨½ØÍ¼À´×ÔPPT£©£º

Zval´Ó24¸ö×Ö½ÚϽµµ½16¸ö×Ö½Ú£¬ÎªÊ²Ã´»áϽµÄØ£¬ÕâÀïÐèÒª²¹Ò»µãµãµÄCÓïÑÔ»ù´¡£¬¸¨Öú²»ÊìϤCµÄͬѧÀí½â¡£structºÍunion£¨ÁªºÏÌ壩Óе㲻ͬ£¬StructµÄÿһ¸ö³ÉÔ±±äÁ¿Òª¸÷×ÔÕ¼¾ÝÒ»¿é¶ÀÁ¢µÄÄÚ´æ¿Õ¼ä£¬¶øunionÀïµÄ³ÉÔ±±äÁ¿Êǹ²ÓÃÒ»¿éÄÚ´æ¿Õ¼ä£¨Ò²¾ÍÊÇ˵ÐÞ¸ÄÆäÖÐÒ»¸ö³ÉÔ±±äÁ¿£¬¹«Óпռä¾Í±»ÐÞ¸ÄÁË£¬ÆäËû³ÉÔ±±äÁ¿µÄ¼Ç¼Ҳ¾ÍûÓÐÁË£©¡£Òò´Ë£¬ËäÈ»³ÉÔ±±äÁ¿¿´ÆðÀ´¶àÁ˲»ÉÙ£¬µ«ÊÇʵ¼ÊÕ¼¾ÝµÄÄÚ´æ¿Õ¼äȴϽµÁË¡£
³ý´ËÖ®Í⣬»¹Óб»Ã÷ÏԸıäµÄÌØÐÔ£¬²¿·Ö¼òµ¥ÀàÐͲ»ÔÙʹÓÃÒýÓá£
Zval½á¹¹Í¼£¨À´Ô´ÓÚPPTÖУ©£º

ͼÖÐZvalµÄÓÉ2¸ö64bits£¨1×Ö½Ú=8bit£¬bitÊÇ¡°Î»¡±£©×é³É£¬Èç¹û±äÁ¿ÀàÐÍÊÇlong¡¢bealoonÕâЩ³¤¶È²»³¬¹ý64bitµÄ£¬ÔòÖ±½Ó´æ´¢µ½valueÖУ¬¾ÍûÓÐÏÂÃæµÄÒýÓÃÁË¡£µ±±äÁ¿ÀàÐÍÊÇarray¡¢objec¡¢stringµÈ³¬¹ý64bitµÄ£¬value´æ´¢µÄ¾ÍÊÇÒ»¸öÖ¸Õ룬ָÏòÕæÊµµÄ´æ´¢½á¹¹µØÖ·¡£
¶ÔÓÚ¼òµ¥µÄ±äÁ¿ÀàÐÍÀ´Ëµ£¬ZvalµÄ´æ´¢±äµÃ·Ç³£¼òµ¥ºÍ¸ßЧ¡£
²»ÐèÒªÒýÓõÄÀàÐÍ£ºNULL¡¢Boolean¡¢Long¡¢Double
ÐèÒªÒýÓõÄÀàÐÍ£ºString¡¢Array¡¢Object¡¢Resource¡¢Reference
3. ÄÚ²¿ÀàÐÍzend_string
Zend_stringÊÇʵ¼Ê´æ´¢×Ö·û´®µÄ½á¹¹Ì壬ʵ¼ÊµÄÄÚÈÝ»á´æ´¢ÔÚval£¨char£¬×Ö·ûÐÍ£©ÖУ¬¶øvalÊÇÒ»¸öcharÊý×飬³¤¶ÈΪ1£¨·½±ã³ÉÔ±±äÁ¿Õ¼Î»£©¡£

½á¹¹Ìå×îºóÒ»¸ö³ÉÔ±±äÁ¿²ÉÓÃcharÊý×飬¶ø²»ÊÇʹÓÃchar*£¬ÕâÀïÓÐÒ»¸öСÓÅ»¯¼¼ÇÉ£¬¿ÉÒÔ½µµÍCPUµÄcache miss¡£
Èç¹ûʹÓÃcharÊý×飬µ±mallocÉêÇëÉÏÊö½á¹¹ÌåÄڴ棬ÊÇÉêÇëÔÚÍ¬Ò»Æ¬ÇøÓòµÄ£¬Í¨³£Êdz¤¶ÈÊÇsizeof(_zend_string) + ʵ¼Êchar´æ´¢¿Õ¼ä¡£µ«ÊÇ£¬Èç¹ûʹÓÃchar*£¬ÄǸöÕâ¸öλÖô洢µÄÖ»ÊÇÒ»¸öÖ¸Õë£¬ÕæÊµµÄ´æ´¢ÓÖÔÚÁíÍâһƬ¶ÀÁ¢µÄÄÚ´æÇøÓòÄÚ¡£
ʹÓÃchar[1>ºÍchar*µÄÄÚ´æ·ÖÅä¶Ô±È£º

´ÓÂ߼ʵÏֵĽǶÈÀ´¿´£¬Á½Õ߯äʵҲûÓжà´óÇø±ð£¬Ð§¹ûºÜÀàËÆ¡£¶øÊµ¼ÊÉÏ£¬µ±ÕâЩÄÚ´æ¿é±»ÔØÈëµ½CPUµÄÖУ¬¾ÍÏԵ÷dz£²»Ò»Ñù¡£Ç°ÕßÒòΪÊÇÁ¬Ðø·ÖÅäÔÚÒ»ÆðµÄͬһ¿éÄڴ棬ÔÚCPU¶Áȡʱ£¬Í¨³£¶¼¿ÉÒÔһͬ»ñµÃ£¨ÒòΪ»áÔÚͬһ¼¶»º´æÖУ©¡£¶øºóÕߣ¬ÒòΪÊÇÁ½¿éÄÚ´æµÄÊý¾Ý£¬CPU¶ÁÈ¡µÚÒ»¿éÄÚ´æµÄʱºò£¬ºÜ¿ÉÄܵڶþ¿éÄÚ´æÊý¾Ý²»ÔÚͬһ¼¶»º´æÖУ¬Ê¹CPU²»µÃ²»ÍùL2£¨¶þ¼¶»º´æ£©ÒÔÏÂѰÕÒ£¬ÉõÖÁµ½ÄÚ´æÇøÓò²éµ½ÏëÒªµÄµÚ¶þ¿éÄÚ´æÊý¾Ý¡£ÕâÀï¾Í»áÒýÆðCPU Cache Miss£¬¶øÁ½ÕߵĺÄʱ×î¸ß¿ÉÒÔÏà²î100±¶¡£
ÁíÍ⣬ÔÚ×Ö·û´®¸´ÖƵÄʱºò£¬²ÉÓÃÒýÓø³Öµ£¬zend_string¿ÉÒÔ±ÜÃâµÄÄڴ濽±´¡£
4. PHPÊý×éµÄ±ä»¯£¨HashTableºÍZend Array£©
ÔÚ±àдPHP³ÌÐò¹ý³ÌÖУ¬Ê¹ÓÃ×îÆµ·±µÄÀàÐÍιýÓÚÊý×飬PHP5µÄÊý×é²ÉÓÃHashTableʵÏÖ¡£Èç¹ûÓñȽϴÖÂԵĸÅÀ¨·½Ê½À´Ëµ£¬ËüËãÊÇÒ»¸öÖ§³ÖË«ÏòÁ´±íµÄHashTable£¬²»½öÖ§³Öͨ¹ýÊý×éµÄkeyÀ´×öhashÓ³Éä·ÃÎÊÔªËØ£¬Ò²ÄÜͨ¹ýforeachÒÔ·ÃÎÊË«ÏòÁ´±íµÄ·½Ê½±éÀúÊý×éÔªËØ¡£
PHP5µÄHashTable£¨½ØÍ¼À´×ÔÓÚPPT£©£º

Õâ¸öͼ¿´ÆðÀ´ºÜ¸´ÔÓ£¬¸÷ÖÖÖ¸ÕëÌøÀ´ÌøÈ¥£¬µ±ÎÒÃÇͨ¹ýkeyÖµ·ÃÎÊÒ»¸öÔªËØÄÚÈݵÄʱºò£¬ÓÐʱÐèÒª3´ÎµÄÖ¸ÕëÌøÔ¾²ÅÄÜÕÒ¶ÔÐèÒªµÄÄÚÈÝ¡£¶ø×îÖØÒªµÄÒ»µã£¬¾ÍÔÚÓÚÕâЩÊý×éÔªËØ´æ´¢£¬¶¼ÊÇ·ÖÉ¢ÔÚ¸÷¸ö²»Í¬µÄÄÚ´æÇøÓòµÄ¡£Í¬Àí¿ÉµÃ£¬ÔÚCPU¶ÁÈ¡µÄʱºò£¬ÒòΪËüÃǾͺܿÉÄܲ»ÔÚͬһ¼¶»º´æÖУ¬»áµ¼ÖÂCPU²»µÃ²»µ½Ï¼¶»º´æÉõÖÁÄÚ´æÇøÓò²éÕÒ£¬Ò²¾ÍÊÇÒýÆðCPU»º´æÃüÖÐϽµ£¬½ø¶øÔö¼Ó¸ü¶àµÄºÄʱ¡£
PHP7µÄZend Array£¨½ØÍ¼À´Ô´ÓÚPPT£©£º

а汾µÄÊý×é½á¹¹£¬·Ç³£¼ò½à£¬ÈÃÈËÑÛǰһÁÁ¡£×î´óµÄÌØµãÊÇ£¬Õû¿éµÄÊý×éÔªËØºÍhashÓ³Éä±íÈ«²¿Á¬½ÓÔÚÒ»Æð£¬±»·ÖÅäÔÚͬһ¿éÄÚ´æÄÚ¡£Èç¹ûÊDZéÀúÒ»¸öÕûÐ͵ļòµ¥ÀàÐÍÊý×飬ЧÂÊ»á·Ç³£¿ì£¬ÒòΪ£¬Êý×éÔªËØ£¨Bucket£©±¾ÉíÊÇÁ¬Ðø·ÖÅäÔÚͬһ¿éÄÚ´æÀ²¢ÇÒ£¬Êý×éÔªËØµÄzval»á°ÑÕûÐÍÔªËØ´æ´¢ÔÚÄÚ²¿£¬Ò²²»ÔÙÓÐÖ¸ÕëÍâÁ´£¬È«²¿Êý¾Ý¶¼´æ´¢ÔÚµ±Ç°ÄÚ´æÇøÓòÄÚ¡£µ±È»£¬×îÖØÒªµÄÊÇ£¬ËüÄܹ»±ÜÃâCPU Cache Miss£¨CPU»º´æÃüÖÐÂÊϽµ£©¡£
Zend ArrayµÄ±ä»¯£º
1.Êý×éµÄvalueĬÈÏΪzval¡£
2.HashTableµÄ´óС´Ó72Ͻµµ½56×Ö½Ú£¬¼õÉÙ22%¡£
3.BucketsµÄ´óС´Ó72Ͻµµ½32×Ö½Ú£¬¼õÉÙ50%¡£
4.Êý×éÔªËØµÄBucketsµÄÄÚ´æ¿Õ¼äÊÇһͬ·ÖÅäµÄ¡£
5.Êý×éÔªËØµÄkey£¨Bucket.key£©Ö¸Ïòzend_string¡£
6.Êý×éÔªËØµÄvalue±»Ç¶Èëµ½BucketÖС£
7.½µµÍCPU Cache Miss¡£
5. º¯Êýµ÷ÓûúÖÆ£¨Function Calling Convention£©
PHP7¸Ä½øÁ˺¯ÊýµÄµ÷ÓûúÖÆ£¬Í¨¹ýÓÅ»¯²ÎÊý´«µÝµÄ»·½Ú£¬¼õÉÙÁËһЩָÁÌá¸ßÖ´ÐÐЧÂÊ¡£
PHP5µÄº¯Êýµ÷ÓûúÖÆ£¨½ØÍ¼À´×ÔÓÚPPT£©£º

ͼÖУ¬ÔÚvmÕ»ÖеÄÖ¸Áîsend_valºÍrecv²ÎÊýµÄÖ¸ÁîÊÇÏàͬ£¬PHP7ͨ¹ý¼õÉÙÕâÁ½ÌõÖØ¸´£¬À´´ïµ½¶Ôº¯Êýµ÷ÓûúÖÆµÄµ×²ãÓÅ»¯¡£
PHP7µÄº¯Êýµ÷ÓûúÖÆ£¨½ØÍ¼À´×ÔÓÚPPT£©£º

6. ͨ¹ýºê¶¨ÒåºÍÄÚÁªº¯Êý£¨inline£©£¬ÈñàÒëÆ÷ÌáǰÍê³É²¿·Ö¹¤×÷
CÓïÑԵĺ궨Òå»á±»ÔÚÔ¤´¦Àí½×¶Î£¨±àÒë½×¶Î£©Ö´ÐУ¬Ìáǰ½«²¿·Ö¹¤×÷Íê³É£¬ÎÞÐèÔÚ³ÌÐòÔËÐÐʱ·ÖÅäÄڴ棬Äܹ»ÊµÏÖÀàËÆº¯ÊýµÄ¹¦ÄÜ£¬È´Ã»Óк¯Êýµ÷ÓõÄѹջ¡¢µ¯Õ»¿ªÏú£¬Ð§ÂÊ»á±È½Ï¸ß¡£ÄÚÁªº¯ÊýÒ²ÀàËÆ£¬ÔÚÔ¤´¦Àí½×¶Î£¬½«³ÌÐòÖеĺ¯ÊýÌæ»»Îªº¯ÊýÌå£¬ÕæÊµÔËÐеijÌÐòÖ´Ðе½ÕâÀ¾Í²»»á²úÉúº¯Êýµ÷ÓõĿªÏú¡£
PHP7ÔÚÕâ·½Ãæ×öÁ˲»ÉÙµÄÓÅ»¯£¬½«²»ÉÙÐèÒªÔÚÔËÐн׶ÎÒªÖ´ÐеŤ×÷£¬·Åµ½Á˱àÒë½×¶Î¡£ÀýÈç²ÎÊýÀàÐ͵ÄÅжϣ¨Parameters Parsing£©£¬ÒòΪÕâÀïÉæ¼°µÄ¶¼Êǹ̶¨µÄ×Ö·û³£Á¿£¬Òò´Ë£¬¿ÉÒԷŵ½µ½±àÒë½×¶ÎÀ´Íê³É£¬½ø¶øÌáÉýºóÐøµÄÖ´ÐÐЧÂÊ¡£
ÀýÈçÏÂͼÖд¦Àí´«µÝ²ÎÊýÀàÐ͵ķ½Ê½£¬´Ó×ó±ßµÄд·¨£¬ÓÅ»¯ÎªÓұߺêµÄд·¨¡£

Èý¡¢Ð¡½á
Äñ¸çµÄPPTÀï·Å³ö¹ýÒ»×é¶Ô±ÈÊý¾Ý£¬¾ÍÊÇWordPressÔÚPHP5.6Ö´ÐÐ100´Î»á²úÉú70ÒڴεÄCPUÖ¸ÁîÖ´ÐÐÊýÄ¿£¬¶øÔÚPHP7ÖÐÖ»ÐèÒª25ÒڴΣ¬¼õÉÙ64.2%£¬ÕâÊÇÒ»¸öÁîÈËÕ𺳵ÄÊý¾Ý¡£
ÔÚÄñ¸çµÄÕû¸ö·ÖÏíÖУ¬¸øÎÒ×îÉî¿ÌµÄÒ»¸ö¹ÛµãÊÇ£ºÒª×¢Òâϸ½Ú£¬ºÜ¶à¸öϸСµÄÓÅ»¯£¬Ò»µãµã³ÖÐøµØ»ýÀÛ£¬»ýÉٳɶ࣬×îÖÕ»ã¾ÛΪ¾ªÑ޵ijɹû¡£ÎªÉ½¾ÅØð£¬ÆñÒ»ÈÕÖ®¹¦£¬ÎÒÏë´ó¸ÅÒ²ÊÇÕâ¸öµÀÀí¡£
ºÁÎÞÒÉÎÊ£¬PHP7ÔÚÐÔÄÜ·½ÃæÊµÏÖ¿çԽʽµÄÌáÉý£¬Èç¹ûÄܹ»½«ÕâЩ³É¹ûÓ¦ÓÃÔÚPHPµÄWebϵͳÖУ¬Ò²ÐíÎÒÃÇÖ»ÐèÒª¸üÉٵĻúÆ÷£¬¾Í¿ÉÒÔÖ§³ÅÆð¸ü¸ßÇëÇóÁ¿µÄ·þÎñ¡£PHP7Õýʽ°æµÄ·¢²¼£¬ÁîÈ˳äÂúÎÞÏÞã¿ã½¡£ |