YAPC::Asia tokyo 2015 uzulla
̥̝̥ఇࠃͷٯऻʂ• ͜ͷτʔΫϠδOKͰ͢• ͜ͷτʔΫস͍ͬͯͩ͘͞• υϯυϯֻ͔͖ͬͯͯཉ͍͠
View Slide
who am i ?UZULLAPHPerHachioji.pmʮϝʔϧϑΥʔϜΛॻ͍ͯੜ׆ʯ
Σϒք۾Ͱ༗໊ͳʮPHPʯ͕ɺͲΜͳͷ͔օ͞Μͬͯ·͔͢ʁ
͕࣌ؒͳ͍ͷͰ!• ڈͨ͠ʮͳPHPDisʯͰάά͍ͬͯͩ͘͞• ࡢYAPC::AsiaͰҰ൪έͨ(?)τʔΫͰ͢• ࠷ۙͷPHPͷۃॳาతͳ͜ͱղΔͣʢʁʣ• https://www.youtube.com/watch?v=2tZxNtn0kDc• http://www.slideshare.net/junichiishida/yapc-2014-phpuzullatalk
ࡾߦͰ• PHPJavaͱPerlͱHTML/JSΛ·ͥͨΑ͏ͳ• ςϯϓϨʔτΤϯδϯͰ͢• ʮΏΔ;Θ͆͆͆͆͆ʯ
ʮΏΔ;Θݴޠ͆͆͆ʯ• ࠷ۙͷPHPਅ໘ʹ͔ͭ͏ͱΏΔ;ΘͰͳ͍• ·͋ͰΏΔ;Θʹॻ͚Δ• ੍ࣗ৺ΛͬͯऔΓΉͷ͕ਖ਼͍͠PHPerͷSUTAIRU
PHPఇࠃͷٯऻ• ʮٯऻͷͨΊʹணʑͱྗΛ͔ͨΊͭͭ͋Δ͕ɺຊฤʹೖΕͳ͔ͬͨΑ…ʯ• ʮͬͱ͕ΜΖ…ʯ
ʮPHPఇࠃਓࡐΛืूதͰ͢ʯ• Έͳ͞ΜʹPHPΛॻ͍ͯΒ͍͍ͨ• ͦΕ͕ࢲͷΈͰ͢
͓ॻ͖• དྷͨΔ͖PHP7ʹ͍ͭͯ• PHPͷΤϥʔʹ͍ͭͯ• ࠷ۙͷhttpdʹ͍ͭͯ• PSR-7ʹ͍ͭͯ• ʮ͋ͷਓࠓʯ
ʮۙະདྷPHPηϒϯʂʯ• ʮVarsion 7.0.0ʯ• ݱࡏbeta3ɺࠓͷౙstable༧ఆ• PHP6ແ͔ͬͨࣄʹʢ৭ʑ͋ͬͨʣ• ळʹ5.4EOL!ɺ5.5طʹSecurity fixesonlyhttp://php.net/supported-versions.php
·ͣ
!!!!!!RC1 ReleaseYEAH!!!!!!!!!!
ࡾߦͰղΔPHP7• ഒ͘Β͍͘ͳͬͨ!• ͍ํߏஙํ๏มΘ͍ͬͯͳ͍"• จ๏͕ਐԽɺPHPίʔυޓੑଟগյΕͨ#• ͞ͱҾ͖ସ͑ʹC֦ு܈͕க໋ইΛෛͬͨ$
͘ͳͬͨ݅• ഒ͘Β͍͘ͳͬͨ• PHP7 >>>> PHP5.6 > PHP5.5,5.4 >> PHP5.3• (HHVM)
ग़యhttps://kinsta.com/blog/hhvm-vs-php-7/http://blog.litespeedtech.com/2015/07/24/php-7-vs-hhvm-benchmark-series-2-wordpress/http://blog.litespeedtech.com/2015/07/16/php7-vs-hhvm-benchmark-series-1-hello-world/https://www.zend.com/en/resources/php7_infographichttp://hhvm.com/blog/9293/lockdown-results-and-hhvm-performancehttps://ckon.wordpress.com/2015/08/09/
Կނ͘ͳ͔ͬͨʁ• ʮ͔ͤͬͭΕͨPHPਞӦ͕ຊؾͩͨ͠ʯ• ओʹมͷϝϞϦ্ͷߏ͕มߋ• ʮ΄Μͷͷ͍Εͭʂʯ• zvalͰάά͍ͬͯͩ͘͞• (ͦͦԶ͕ͦΜͳʹৄ͘͠ͳ͍)• ঈͱͯ͠ɺC֦ு͕Ұશ໓ͨ͠ʢޙड़ʣ
ࠓޙ͘ͳΓͦ͏• HHVMͷ༷ͳJITԽΛݟਾ͍͑ͯΔΒ͍͠• ASTΛ࡞ΔΑ͏ʹͳͬͨ• ͞Βʹ͕৳ͼΔՄೳੑ
͍• ͘ͳͬͨҎ্Ͱ͢
PHP7Ͱ͍ํมΘ͔ͬͨʁ• php-fpmΈ͍ͨͳͷ͕૿͑ͨͱ͔ͦ͏͍͏ͷແ͍ɻ• ࠓ·Ͱ௨Γͷmod_php,php-fpm,php(-cgi)• Ϗϧυํ๏΄΅ಉ͡• Stable͕ͰΕɺී௨ʹaptʹΔͰ͠ΐ͏• yumԿޙͩʁ(Ϩουϋοౘஊ
҆ఆ͍ͯ͠Δ• ͍··Ͱ௨ΓɺԿߟ͑ͳͯ͘མͪͮΒ͍ɻ҆ఆ͍ͯ͠Δɻ• ʮPHP͕҆ఆʂʁʂʁʂʁʯ• ʮಔᮐύʔιϯʯͱ͍͏ࣾձ࣮ݧ• ·͋ɺॏ͘ͳΔ͚Ͳͳ͆
httpdपΓͰ…• ࠷ۙH2Oͱ͍͏httpd͕͋ΒΘΕ·ͨ͠Ͷʂ• ผʹPHPͱ͍͕ؔ͋͢͝ΔΘ͚Ͱͳ͍͚Ͳ• ͕࣌ؒ༨Ε͠·͢ɻ
PHP+httpdʹ͍ͭͯ• Apache+mod_php , (Apache+fastCGI)• nginx+fastCGI• H2O+fastCGI , H2O+CGIϚωʔδϟ• nginx+Apache+mod_php
Apache+mod_php• mod_phpͱ͍͏మ൘• yumaptͰೖΔ• ΄΅ઃఆϨε͔ɺ.htaccessͰࡁΉ• ʢσϑΥϧτͰʣଟίωΫγϣϯʹऑ͍• ͞ΕͲమ൘
Apacheͷઃఆ# httpd.confLoadModule php5_module modules/libphp5.soSetHandler application/x-httpd-php# .htaccessRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^ index.php [QSA,L]
༨ஊɺҰߦAddHandlerηΩϡϦςΟతʹϠό͍# httpd.confAddHandler php5-script .php• Α͘ݟ͔͚Δهड़͕ͩ…• http://d.hatena.ne.jp/tmatsuu/20150221/1424531513• AddHandlerผʹʮ֦ுࢠʯͰͳ͍ͷͰɺ.php͕ϑΝΠϧ໊Ͳ͜ʹ͍ͬͯͯPHPͱͯ͠ղऍ͞ΕΔ᠘
nginx+php-fpm• ࠷ۙͷఆ൪͔ʁ• ࣮ࡍ͍• nginxͳΜͰͰ͖ΔɺຊʹԿͰɻ• ݁ՌɺઃఆෳࡶʹͳΓ͕ͪ
nginxͷίϯϑΟάྫindex index.phptry_files $uri $uri/ $uri/index.php /index.php;location ~ \.php$ {fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;# !ͷઃఆϑΝΠϧͷதʹେྔͷઃఆ͕Ӆ͞Ε͍ͯΔ…ʂinclude fastcgi_params;}• ղΓͮΒ͍ʂʂʂʂʂ• ͜Ε͚ͩͰμϝͳࣄ͋Δ
nginx㙽ʹ֯͘͜͠ͳΓ͕ͪ• FastCgiͷ߹Ͱ͋Δͷ͚ͩΕͲ…• /formͳͲɺPHPϑΝΠϧ໊͕ͳ͍URLΛ͏߹…• try_filesΛͪΌΜͱཧղ͠ͳ͍ͱμϝ• locationΛͪΌΜͱཧղ͠ͳ͍ͱμϝ• fastcgiͷύϥϝλΛͪͪ͘͘Ճͨ͠Γ• PATH_INFOΛͲ͏ੜ͢Δ͔ͰΉ
H2O+fastCGI , H2O+fcgi.spawn• ظͷ৽ਓ• http/2• ઃఆϑΝΠϧ͕γϯϓϧʂ• ͦͷ··ͰߴʢΒ͍͠ʣ• ·ͩݟগͳ͍
h2o+php-fpmfile.custom-handler:extension: .phpfastcgi.connect:host: 127.0.0.1port: 9000type: tcphosts:"doraperson2015.yapcasia.org:443":paths:/:file.dir: /var/www/dora-person-election/app/htdocsredirect:url: /index.php/internal: YESstatus: 307
h2o+php-cgi(fastcgi.spawn)file.custom-handler:extension: .phpfastcgi.spawn: "PHP_FCGI_CHILDREN=10 exec /path/to/php-cgi"• phpϓϩηεͷੈΛh2oʹ·͔ͤΒΕΔʂ• php-fpmෆཁɺࢹ͕ݮΔ!• ɺͺͬͱݟphp-fpmͱḮ৭ͳͦ͞͏• php-fpm.confͳͲΛॻ͔ͳͯ͘ྑ͍"
h2oॴݟ ྑ͍• ຊਓͷkazuho͞Μ͕ͭͬͯ͘Δʂʂ• ࣭͢Δͱɺ͓͑ͯ͘͠Ε͍ͯ͞͠ʂʂʂʂ• ଞʹ͘Βɺ࠷ݶͷઃఆϑΝΠϧγϯϓϧͰ͋Δ• ϑΝΠϧ֦ுࢠʹͻ͍ͮͯΔͷͰɺ҆શ• fastcgi.spawnศརʂʂʂ
h2oॴݟ ଟ͜Ε͔Βͷ• .htaccessແ͍ͷͰɺڽͬͨઃఆͩͱͬͺΓ͍• try_filesతͳ֓೦Θ͔Βͳ͍ͱ…• ͽͪͺʔʹϏϧυ͕໘• yumͱ͔aptͱ͔΄͍͠ΑͶ͆• ઃఆͷൿͷͨΕ·ͩগͳΊɺಛʹӡ༻• ߏ͕গʑಠಛɺinit.dͳͲͲ͏͢Δʁ
ͲΕ͕ྑ͍͔• ʮଟগͯ͘άάΕղܾ͢ΔApacheʯ• ʮnginxͷίϯϑΟάɺෳࡶ͗͢ͳ͍ʁʯ• ʮH2Oʢ·ͩʣάάͬͯղܾ͠ͳ͘ͳ͍ʁʯ• దࡐదॴ
༨ஊɺPHPΰϛΛ٧ΊࠐΉจԽʁ͕͋Δ• ઃఆ͢ΔػೳຖͰͳ͘ɺΞϓϦຖͰԡ͠ࠐΊΔͱPHPͬΆ͍• .htaccesshttpdͷઃఆ͔ΒURLϚοϓΛͻ͖͕ͯͯ͠ɺָ• PHPͷαΠτࠞࡌʹͳΓ͕ͪɺΠέͯΔํ๏͕ͳ͍ͷ͔ͱͳ·͍͠ɻ• ࠶ىಈ͕ඞཁͰ͍͍͔Βɺ.htaccessΈ͍ͨͳͷ͕΄͍͠…
bench• έʔεόΠέʔε͗͢Δ…• Apacheͷνϡʔϯ໘• nginxയવͱ͘ͳΔ͕ɺྑ͍ઃఆͰΉ• ʮH2Oύϥϝλ͕σϑΥϧτͰΠέͯΔʂʯͱ࡞ऀ͕ओுͯͯ͠ΛసՇͰ͖Δ(?)
͞Βʹ༨ஊ• PHPPaaS;͖͑ͯͯ·͢• Heroku• Azure app service• Google App Engine• ͍ͣΕਖ਼ࣜʹʢͱ͍͑ɺ·ͩPHP5.5ɺ.6͘Β͍ʣ
͍
PHP7ͷඇޓੑͷ• ʮϚΠφʔͰޓੑ͕յΕΔࣄʹʢҰ෦Ͱʣఆධͷ͋ΔPHPʯ• ϝδϟʔόʔδϣϯΞοϓͳͷͰյΕͨ!
લ͖ͳํͷඇޓੑʢޙड़͠·͢ʣ• େඇਪ͕࣮ؔࡍʹআ• ϚχΞοΫͳՕॴͷڍಈͷมԽ• ࡉ͔͍จ๏ͷඇޓੑ• ༧ޠ
݁ߏ೦ͳํͷඇޓੑ• C֦ு(ॴҦpeclͱ͔)ͷඇޓੑ• gdͱ͔͋Δ• memcacheʮdʯ͋Δ͚Ͳɺmemcacheͳ͍• redisͱ͔ɺQueueܥͱ͔͕ʢ·ͩʣͳ͍• PPͷͷ(େମ)ಈ͘• Release·Ͱʹͬͱ૿͑Δͣ
ʮ͜ͷઌੜ͖Δʹʯ• ʮC͕Θ͔Βͳ͍PHPer͔ͭ͠ͳ͍ΑͶ…ʯʮ͑ͬPHPerͬͯCΘ͔Βͳ͍ͷʁʯ• ϝδϟʔॴϘνϘνରԠ͞Ε͍ͯΔ• C֦ுΨϦΨϦॻ͍͖ͯͨํʑɺ͔ͯ͠͠ݟΓͷλΠϛϯά͔͠Εͳ͍͆
ʢҰ෦ͷXSΛॻ͘CPANԦαʔͷօ͞Μʣ• ʮͲ͔ͬͰฉ͍ͨ͜ͱ͋Δͩͳʯ• ʮ෦APIมΘΔͷɺ͔ͨ͠ͳ͍͚Ͳ͎ŵŧƄແཧ…ʯ
ݴޠͱͯ͠ͷվળ• ඇਪͷΓࣺͯ• Type HintingվΊType declarationsʢܕએݴʣͷڧԽ• ΤϥʔͷऔΓѻ͍ͷڧԽ• จ๏ͷՃ
ඇਪͷΓࣺͯ• ‼mysqleregͷϏοάωʔϜ͕͍ͭʹഇࢭ• ❗ศར(ҋ)ػೳɺpreg_replaceͷ e(eval)ഇࢭ• ❔ݹͷ=&ɺ<%ʙ%>ɺlanguage=php>ʙͷഇࢭ• ͍ͣΕ͍͜ͱܯࠂࡁΈ• 105.3Λ͍ͬͯͯʮϏοάΣʔϒʹΖ͏ͥʂʯͱ͍͏ॴ͕ࢮ͵
Type declarations(ܕએݴ)• ݩType Hinting• ҾฦͷʮܕʯΛࢦఆ• ʢPHPͷʮܕʯͰ͢ʣ• ʮJava͍ʯ• ҧͰྫ֎ʢPHP<7Τϥʔʣ• 7͔ΒεΧϥΛࢦఆՄೳʹ㊗• 7͔ΒฦࢦఆՄೳʹ"
ͷεΧϥ͕ࢦఆՄೳʹʂfunction func(int $num){}func('a'); // => TypeError Exception !"func('1'); // => OK #$• ʮ͔͠͠'1'௨Δʯ• ʢօ͞ΜʣʮOK͡ΌͶ͑Α͆͜Ε͔ͩΒPHPer͆͆͆ʯ
…ͱ͓͔ͬͨʁ
strict_typesdeclare(strict_types=1); // !function func(int $num){ /* ʙ */}func('1'); // => TypeError "func(1.0); // => TypeError ""func(true); // => TypeError """• ઌ಄ͷdeclare(strict_types=1);Ͱݫ֨ʹ• float=>int❌ͳͷɺڻ͖ͷϚοτͳڍಈ͆
ͨͩ͠• int->floatΩϟετʮOKʯ• ʢ͕ܽམ͠ͳ͍͔ΒͩΖ͏ʣ• Type declarationsʹΑͬͯɺ༧ظͤ͵ܕΩϟετ͕ൃੜ͢Δ͜ͱ͕…
ࣗಈΩϟετͰ͜Ε͕ΤϥʔʹͳΔfunc(1); // !ͱͱͷintͳҾ͕function func(float $num){ // "͜͜ͰfloatʹͳΓfunc2($num); // #TypeErrorʹͳΔ}function func2(int $num){ // $func2ͷҾintࢦఆͳͷͰ}• int->floatΩϟετ͞ΕΔ!• ·͋ɺPHPΒ͍͠Ͱ͢Ͷ"
͜Εخ͍͠ɺฦࢦఆՄೳfunction func() : int { // !return 1;}• Θͳ͍ਓলུ͢ΕOK
೦ʁҙʁϙΠϯτfunction func(){$a = 1;returnfunction ()use ( int $a ) { // Errorreturn $a*2;}}• use۟ʹʢRC1ͷݱ࣌ͰʣܕએݴͰ͖ͳ͍
ʮͱ͜ΖͰɺTypeʹԿ͕ࢦఆͰ͖Δͷʁʯ• array• callable,Closure(ແ໊ؔ)• Ϋϥε/ΠϯλʔϑΣΠε• int,float,string,bool ㊗Ճ
͜͏͍͏ͷࢦఆͰ͖ͳ͍• ❌ : (function(int): int)• (HackͳΒͰ͖Δ)• ❌ : \DateTime[]• PHPDocͰ͓ͳ͡Έɺཉ͍͠…• ❌ : mixed• ·͊ɺॻ͔ͳ͚ΕՁ
ͬͨ࣌ɺͲ͏ͳͷʁ• ༗Γ 0.4381 sec• ແ͠ 0.3516 sec• ࠩ 0.0865 sec(86.5ms) / Ұઍສճ• MBP i7+PHP7β2Ͱɺ10,000,000(Ұઍສ)ճͯ͜͠ͷఔ• (PHPͷ༻్Ͱ)࣮༻্ޡࠩͳͷͰؾܰʹ͍͍ͨɻ
ࢼͨ͠ίʔυfunction func (int $num): int{ return $num; } // ༗Γfunction func2 ($num) { return $num; } // ແ͠$start = microtime(true);for($i=0;$i<10000000;$i++){func($i); // OR func2($i);}echo microtime(true) - $start;• ͪͳΈʹɺis_intͰࣅͨΑ͏ͳίʔυॻ͍ͨΒ͕΄΅ಉͩͬͨ͡
க໋తΤϥʔͷϋϯυϦϯά͕Մೳʹͳͬͨ• PHPʹྫ֎ͱΤϥʔɺೋ͕ͭଘࡏ• Τϥʔʹக໋త(Fatal)ͱඇக໋త͕͋Δ• க໋తΤϥʔ؆୯ʹϋϯυϧͰ͖ͳ͔ͬͨ• PHP7͔Β(Ұ෦Λআ͖)Fatal ErrorΛྫ֎ͰϋϯυϧՄೳ!• https://wiki.php.net/rfc/engine_exceptions_for_php7
PHPͷʮExceptionʯ• ΈΜͳ͕ͬͯΔྫ֎ͦͷͷ• catchͯ͠ճ෮Ͱ͖Δ• Θ͔Γ͍͢ʂʂ
PHPͷʮΤϥʔʯ• ਅ໘ʹ͢ͱ30Ҏ্͠ΌΕΔͷͰ3ߦͰ• શମͰҰݸ͔͠ϋϯυϥΛొͰ͖ͳ͍ྫ֎Έ͍ͨͳͷ• க໋తͳΤϥʔɺεΫϦϓτΛͦ͜Ͱऴྃͤ͞Δ(ճ෮ෆՄೳ)• ྫɿύʔεΤϥʔɺॏෳએݴΤϥʔɺඇଘࡏؔίʔϧΤϥʔ• ʢৄ͖͖͍ͨ͘͠Ͱ͔͢ʁʣ
PHPͷҋਂ͖Errorʹ͍ͭͯ 1• ΤϥʔΤϥʔϋϯυϥʹɺίʔϧόοΫؔΛొ͢Δ(set_error_handler())͜ͱͰΩϟονͰ͖Δ• ϦΫΤετͰɺάϩʔόϧͳઃఆͰ͋Δ• ྫ֎ͷΑ͏ʹɺ֊ԽͰ͖ͳ͍• ͭ·Γہॴతͳࠩ͠ସ͑Մೳ͕ͩɺඇৗʹෆศ
PHPͷҋਂ͖Errorʹ͍ͭͯ 2• ϋϯυϥΛͰΤϥʔΛΩϟον͢Δͱ…• WarningsNoticeग़ྗ͞Εͳ͍• ѲΓͭͿͤΔ• E_RECOVERABLE_ERRORεΫϦϓτΛऴྃ͠ͳ͍ʢҙ͕ඞཁʣ
PHPͷҋਂ͖Errorʹ͍ͭͯ 3• set_error_handler()Ͱྫ֎ʹม͢Δࣄ͕Ͱ͖Δset_error_handler(function($errno, $errstr, $errfile, $errline){throw new ErrorException($errstr, $errno, 0, $errfile, $errline);});
PHPͷҋਂ͖Errorʹ͍ͭͯ 4• ͨͩ͠ɺக໋తͳΤϥʔଈࢮͰϋϯυϧͰ͖ͳ͍(PHP<7)• register_shutdown_functionΛ͔ͭͬͨτϦοΫ͕ඞཁʢ෮ؼͰ͖ͳ͍ʣregister_shutdown_function(function(){$e = error_get_last();if( $e['type'] == E_ERROR ||$e['type'] == E_PARSE ||$e['type'] == E_CORE_ERROR ||$e['type'] == E_COMPILE_ERROR ||$e['type'] == E_USER_ERROR ){// ͓͖ͳॲཧΛॻ͘echo "க໋తͳΤϥʔ͕ൃੜ͠·ͨ͠ɻ\n";echo "Error type:\t {$e['type']}\n";echo "Error message:\t {$e['message']}\n";echo "Error file:\t {$e['file']}\n";echo "Error line:\t {$e['line']}\n";}});
PHPͷҋਂ͖Errorʹ͍ͭͯ 5• ൃੜͨ͠Τϥʔࣗମͷग़ྗઌมߋՄೳ• ϒϥβʔ(display_errorsͰOn/Off)• ϩάग़ྗ(stderr,syslog,ϑΝΠϧ)• ͜ͷೋͭฒྻతͳ
PHPͷҋਂ͖Errorʹ͍ͭͯ 6• Τϥʔʹࢁछྨ͕͋Δ• ඇக໋తͳͷ• E_NOTICEɺE_WARNINGɺE_DEPRECATEDɺ…• க໋తͳͷ• E_PARSEɺE_ERRORɺ…• Ͳͬͪͱ͍͑ͳ͍ͷ
PHPͷҋਂ͖Errorʹ͍ͭͯ 7• E_RECOVERABLE_ERROR(ޙड़)ʮΩϟον͢Εʯͦͷޙ࣮ߦͰ͖Δ• ྫ͑ɺType declarationsͷҧͰग़Δ• ͜ΕΛΩϟονͯ͠Ͳ͏ʹ͔ͯ͠Δίʔυݟͨࣄແ͍…
PHPͷҋਂ͖Errorʹ͍ͭͯ 8• ΤϥʔઃఆʢϏοτϚεΫʣͰൃੜछྨΛࢦఆՄೳ• error_reporting(0)࠷ڧɺԿग़ͳ͍• ʮக໋తΤϥʔͰ͢Βʂʯ• ʮࣗʯͷύʔεΤϥʔʢE_PARSEʣϜϦ• includeͷύʔεΤϥʔ௨աͰ͖Δʢʂʣ
PHPͷҋਂ͖Errorʹ͍ͭͯ 9• ѱ໊ߴ͍@ɺ؆୯ʹΤϥʔΛ੍Ͱ͖Δɺͦ͏ɺFatalͰͶʂ• ͍Ͱ͢ɻ• includeͨ͠ϑΝΠϧͷύʔεΤϥʔʢE_PARSEʣϜϦ• error_reporting(0)ͷํ͕ͭΑ͍
PHPͷҋਂ͖Errorʹ͍ͭͯ 10• ༨ஊɿPHPʹʢࠓݱࡏʣίϯύΠϧϑΣʔζͳ͍
PHPͷҋਂ͖Errorʹ͍ͭͯ 11• ඇக໋ͷNotice,Warningऴྃ͠ͳ͍• Τϥʔ͕ग़ྗ͞ΕΔ͚ͩ• ѱ໊ߴ͍ʮը໘ʹग़ΔΤϥʔʯ• ʢॳ৺ऀʣʮઃఆΛίϐϖͨ͠ΒΤϥʔ͕͚ͤ·͢ʂʯˠ(ݟ͑ͳ͘ͳ͚ͬͨͩ)
PHPͷҋਂ͖Errorʹ͍ͭͯ 12• use strict;͕ཉ͍͠…• ͨͩɺʹͨΑ͏ͳ࡞ΕΔ• http://uzulla.hateblo.jp/entry/2013/12/20/041619
PHPͷҋਂ͖Errorʹ͍ͭͯ 13• 㙽ʹ֯ʂ• க໋తΤϥʔ͜Ε·Ͱ෮ؼͰ͖ͳ͔ͬͨ❗• ྫɿଘࡏ͠ͳ͍ؔίʔϧɺએݴͷॏෳͳͲ
͘ଓ͍͖ͯͨ(99%ͷਓࠔͬͯͳ͍)• ଞͷݴޠΑΓக໋తΤϥʔͷൣғ͕ͪΐͬͱ͍• ͋·Γeval͕ಘҙͰͳ͍• க໋తΤϥʔϦΧόϦͰ͖ͳ͍• σετϥΫλݺΕͳ͍• ʮന͍ը໘(ಥવࢮ)ʯΛճආ͠ɺจ຺ʹԠͨ͡Τϥʔը໘Λ͢Δͷ͕ͪΐ͍໘
PHP7͔Βɺக໋తΤϥʔྫ֎ͰϦΧόϦʔͰ͖Δ• \Error ΫϥεΛͱͨ͠Ϋϥε͕ྫ֎Ͱ͛ΒΕΔ• க໋తͳΤϥʔͷʮେମશ෦ʯ͕ʮྫ֎ʯʹͳΔ• ͳͬͯͳ͍ॴ͋Δʢྫɿ࠷ॳͷίʔυͰύʔεΤϥʔΩϟονෆೳʣ• ࠷ޙ·ͰΩϟον͞Εͳ͔ͬͨྫ֎ैདྷͷΤ
͜ΕʹΑͬͯ• PHP͕ຯʹෆಘҙͳʮΧοίΠΠ500ʯ͕ग़͘͢͠ͳΔʢ͔ͳʣ• ϝλ͍ίʔυΛॻ͍ͨͱ͖ɺଈࢮ͢ΔՄೳੑΛݮΒͤΔ(ؾ͕͢Δ)• ίʔϧόοΫؔΛଟ༻͢Δͱ͖ͱ͔ศརʢͦ͏ʣ• σʔϞϯͳͲΛॻ͖͘͢ͳΔʢ͔ͳʣ
ྫtry{ଘࡏ͠ͳ͍ؔ();}catch(\Excepion $e){// ௨ৗͷྫ֎͜͜ʹ}catch(\Error $e){// ৽͍͠ɺΤϥʔʢͷྫ֎ʣ͜͜ʹ}// PHP<7 ͜͜ʹ͘Δ͜ͱෆՄೳ
ҙ• NoticeɺWarningྫ֎ʹʮͳΒͳ͍ʯ• ྫ֎ΛΩϟον͠ͳ͍Ͱऴྃ͢ΔͱɺطଘίʔυΛյͪ͠Ό͏• ͭ·Γʮେ౷ҰΤϥʔϋϯυϦϯάʯͰͳ͍• ࠓ·Ͱ௨Γset_error_handlerͰྫ֎ʹมՄೳɺ͕ΜΕʂ
ઌऔΓDisΓใɺΤϥʔฤ• PHPerΏΔ;ΘͳͷͰ catch(\Exception$e) ͱ͔͍͏ϫΠϧυΧʔυΛ͍͕ͪ• ҆қʹ\Exception ͷαϒΫϥεͰΤϥʔͷྫ֎Λੜ͢ͱʮΏΔ;ΘPHPerͷ໋͕Ϡό͍ʯ• ݁Ռɺ\Exceptionͷ͞ΒʹΫϥεͱͯ͠\Throwable͕Ͱ͖ͨɻ\Error\Throwableͷࢠʹɻ
࣮• ͱ͜ΖͰɺ࣮\ErrorExceptionͱ͍͏ྫ֎͢Ͱʹ͋Δ• ʮPHPͷݩ͔Β͋ΔErrorͱɺErrorͱ͍͏৽͍͠ྫ֎ΫϥεͱɺErrorExceptionͱ͍͏ྫ֎Ϋϥε͕ࠞࡏʯ• ͍ͩ͆͆͆͞• ʢ͜͜Beta1͋ͨΓͰRFC͔Β͍͖ͳΓ༷͕͔ΘͬͨͷͰɺ·ͨมΘΔ͔ʣ
ʮࠓޙ༧͞ΕΔະདྷʯ• ʮφϧϗυʂʂࠓޙcatch(\Throwable $e)͔͚͍͍ͬͯΜͩͶʂʂʯ• ʮ!ʯ• ʢerror_reporting(0)ͬͯॻ͍ͯΔਓ͍Δ͔Βɺ͋ͳ͕ͪஊͰͳ͍ʢഭਅʣʣ
จ๏ͷՃ• ??ԋࢉࢠ(isset͔Βͷ։์ʣ<=>ԋࢉࢠ• ແ໊ΫϥεͷՃ
??ԋࢉࢠ• ΈΜͳେ͖isset͔Βͷ٫if(isset($_GET['name']))$name = $_GET['name'];else$name = 'anonymous';!$hoge = (isset($_GET['name'])) ?$_GET['name'] : 'anonymous';!$name = $_GET['name'] ?? 'anonymous' ;• ??ະఆٛมʹ৮ͬͯେৎͰ͢ɺศརʂʂʂʂ
<=> UFOԋࢉࢠ• Rubyͷ͋ΕͰ͢ɺιʔτ͕ศརʹʂʂ$item_list = [ ["id"=>3, "name"=>"uzulla"],["id"=>2, "name"=>"lestrrat"],["id"=>10, "name"=>"moznion"] ];usort($item_list, function ($left, $right) {return $left["id"] <=> $right["id"];});
ෳΧϥϜࢦఆͰ͖·͢usort($item_list, function ($left, $right) {return[$left["id"], strlen($left["name"])]<=>[$right["id"], strlen($right["name"])];});• ͜ΕSQLͷෳORDERͬΆͯ͘ศརͬΆ͍
ແ໊Ϋϥε• ΠϯϥΠϯͰɺଈ࣌ʹΠϯελϯεੜͰ͖Δ• DIͰɺͦͷͰΧδϡΞϧʹΠϯελϯεڍಈΛม͑ΒΕͯศར…͔ͳ• (DIͱ͔͔͍ͯ·͢ͷ͕ɺʮਖ਼͍͠DIʯʹ͍ͭͯצห͍ͯͩ͘͠͞)
ྫ$app->setLogger(new class extends \My\Logger {public function emergency($message,array $context = []){\My\AlertPush($message);parent::emergency($message, $context);}});• ͜Ε֦ுͯ͠Δ͚ͲɺѲΓͭͿ࣌͢ͱ͔ʢʣʹ͑ͦ͏Ͱ͢Ͷ
༧ޠ͕Ճ• Ϋϥε໊/ΠϯλʔϑΣΠε໊• ຯʹΠϯύΫτ͕͋Δ• int, float, bool, string, true, false, null, resource,object, mixed, numeric• Ұ෦ͷWAFʹɺStringͱ͍͏Ϋϥε͕…
PHP7ͷIDEͷରԠ!
͍• ·͋ɺΦγϟϨʹͳΓ·͢Ͷ• ແ໊Ϋϥε͍·͘ΔͱίʔυδϟϯϓͰ͖ͳ͘ͳΓͦ͏ͳͷͰ΄Ͳ΄Ͳʹ͢Δ༧ఆͰ͢• ༧ޠʹΑͬͯຯʹಈ͔ͳ͍ΞϓϦ͕͋Δ…
Γ্͕Γ• ਐΉίϯϙʔωϯτԽ• PSR-7ʢ…͕͜Ε͔Β͘Δʁʣ• ʮϏοάϓϨΠϠʔʯ
ίϯϙʔωϯτԽ• PSR-0,4 ͱComposerͷීٴͰී௨ͷݴޠͬΆ͘ͳΓ…• ୯ମͷORMɺϧʔλʔɺςϯϓϨʔτɺDI׆༻͕׆ൃʹͳΓ…• Symfony, Aura, Zend Framework• ʮΦϨΦϨWAFେ͖ʂʂʯͳਓʹ࠷ߴ
ʮϑϨʔϜϫʔΫࢮΜͰ͍ͳ͍ʯ• 0͔Β·ΕͨൿͷϑϨʔϜϫʔΫɺڊେͳϞϊγϦοΫϑϨʔϜϫʔΫ͔Βͷ٫…ͱɺ͍͏ײ͡Ͱͳ͍ɻ• ݁ہͦΕΒΛ͔ͭͬͨϏοάFW͕ΘΕͯΔ• ͦΕΒͷதͰίϯϙʔωϯτΛ͔͍ͭͬͯͯɺ݁ہδϟΠΞϯτϦʔϓൃੜ͢Δ
ͦΜͳࡢࠓɺྲྀߦΓͦ͏ͳPSR-7• HTTPϝοηʔδΫϥεɺrequest/response• perlͰ͍͏ HTTP::RequestɺJavaͰ͍͏ServletΈ͍ͨͳͷ͕ཉ͍͠ɺͱ͍͏ྲྀΕʢࠓ·ͰFW͕Ί͍Ί͍ʹͬͯͨʣ• PHPࣗମͷػೳͰͳ͍͠ɺinterfaceͰ͔͠ͳ͍
ʮPSRͬͯʁʯ• ༗ࢤʹΑΔɺ۩ମతͳઃܭ༷ͷఏҊ• ΦʔτϩʔυͷϑΝΠϧܗࣜɺϩΨʔAPI• ͋͘·Ͱ༗ࢤͷఏҊͰɺʮ๏ʯͰͳ͍• ੈلౖΓͷPHPσεϩʔυʹடং͕(ը૾ུ)• ڈͷࢲͷൃදΛݟ͍ͯͩ͘͞
PSR-7ͷϝϦοτ• PHPಠಛͳɺάϩʔόϧม͞ΘΓ·͘Γੈքʢ$_GET, $_POSTͳͲʣ͔Βͷ٫(ʁ)• ຯʹ໘ͳ$_FILESͱ͔ΛOOPతʹ৮ΕΔ• ͪΌΜͱ࣮ͨ͠ͳΒɺʮob_*ʯΛۦ͢ΔඞཁݮΔ(ޙड़)
• ൚༻Mock͕࡞Γ͘͢ͳΓςελϒϧɺαϒϦΫΤετͱ͔͍͢͠ʢ͔ʣ• Plack::Middleware Έ͍ͨͳͷ͕ͭ͘ΕΔΑ͏ʹͳΔͣ• ϦΫΤετͷϩΪϯά͘͢͠ͳΔͣ• reactPHPͳͲɺPHPͰॻ͔Εͨhttpd͕ॻ͖͘͢ͳΔʢؾ͕͢Δʣ
σϝϦοτҙ• ੜ$_POSTɺੜechoͷํ͕͍• ૉखͰ͞ΘΔʹେੜͳAPIʢWAF͕Ӆṭ͢ΔͩΖ͏͚Ͳʣ• $_SESSIONʮؚ·Εͳ͍ʯ!• $_POSTʮӅͤͳ͍ʯɺੜecho͢Δͱग़ͪΌ͏ɺ؆୯ʹҳͰ͖ΔʢٻΊΒΕΔ੍ࣗ৺ʣ
ڍಈ࣮࣍ୈͳͷͰ…• ༷௨ΓͪΌΜͱ࣮͢Δͷେมͦ͏• ʮob_*Λීஈ͔Β͔͍ͭ͜ͳ͠ɺόΧͰ͔͍CSVΛग़ྗ͍ͯ͠Δօ͞·ʯɺΠϯελϯεʹϨεϙϯεΛͨΊࠐΉࣄʹջٙతͰ͠ΐ͏ɻ࣮ࡍɺμϝͳ࣮ʮՄೳͰ͢ʯɻ• ʮॻ͖ग़ͯ͠෦ϦμΠϨΫτ͠Α͏ʯʮੈͷதʹapache+mod_php͔͠ͳ͍ਓ͍ΔΜͰ͢Αʂʯ
My fav WAFͰ͋ΔSlim3ͷPSR-7࣮Ͱ• php://tempΛ͔͍ͭͬͯͨ• PHPΈࠐΈͷετϦʔϜϥούʔ• ΦϯϝϞϦʹอ࣋͠ɺσϑΥϧτͰ2MBΛ͑ΔͱཪͰϑΝΠϧʹॻ͖ग़͢
༨ஊ:"Stream"ͷଟ༻ʹ͍ͭͯ• αΠζ͕༧ͮ͠Β͍bodyΛѻ͏ͨΊʹStream͕ΘΕΔࣄ͕ଟ͍༷• ΧδϡΞϧʹมΛ͍͍ͨPHPerʹ໘͆• WAFʹӅṭ͞ΕΔͷͰɺීஈҙࣝ͠ͳͯ͘ྑ͍͕ɺ͕ෆ҆• ͪͳΈʹ$HTTP_RAW_POST_DATAPHP7Ͱແ͘ͳΔɻphp://inputΛ͔ͭ͏͔͠ͳ͍ʢͦͯ͜͠ΕmultipartͰ͔ͭ͑ͳ͍ͷͰɺྗۀͰ౷
PSR-7ͷ࣮Λ͍͔ͭ͘ݟͨײ• ݱঢ়WAF͕Ί͍Ί͍ʹ࣮͍ͯ͠Δ• ͳ͔ͳ͔టष͍͜ͱΛ͍ͬͯΔɺΤοδέʔε͋Γͦ͏…• ಠࣗContent-typeͱ͔ߟ͑ͯͳ͍Ϡπ͋ΔͬΆ͍• ͍͖ͳΓ͜ΕΛʹ͢Δͷෆ҆
ʮPSR-7ඞਢ͔ʁʯ• ྫྷ੩ʹ͍͑ɺNo• ৽͍͠ࣄ͕Ͱ͖ΔΘ͚Ͱͳ͍• ͔͠͠ΦγϟϨ…ςετͦ͢͠͏…͗ͦ͢͠͏…• ʢࢲੈؒΒͣͳͷͰɺ͜͏͍͏ʹὃ͞Ε͍͢ʣ
༨ஊ• ʮαʔϒϨοτ͡ΌΜʯʮ͍ʯ• ʮ͜ͷձʹݟ͋;ΕΔํ͍Βͬ͠Ό͍·ͤΜ͔ɺཔΉྑ͍PSR-7࣮Λ࡞ͬͯ͘Εʯ• ʮPHPͰॻ͔Εͨhttpdͷ͕࣌͘Δʂʯʢͱ͍͏ئʣ
ϓϨΠϠʔͷ• ʮPHPͳΜͯͩΕ͔ͭͬͯͳ͍Ͱ͠ΐ͆͆͆ʯ• ʮΠέͯΔاۀPHP͔ͭͬͯΔͧʂʂʯ• ʮ·ͩFacebookཔΈʁ͆͆ʯ
ϝϧΧϦ༷• YAPCεϙϯαʔͰ͋ΒΕΔ
ಔᮐύʔιϯ
ҧ͏
• chatwork…PHPͰScala…
πΠΩϟεʂ• BUT… ʮେମCͰॻ͍ͯΔʯʢࣾ͞Μஊʣ• ͨͯ͠PHP7ʹҠߦ͢Δͷ͔…ʁ
͍͍ɺ͋ͦ͜PHPͰ͢Αʁ
slack!!!
Slack• https://twitter.com/SlackHQ/status/426469205005705217• PHPslack͔ͭͬͯΔʂʂʢ/index.phpɺ͕͋ΔͬΆ͍ʂʣ• ʮslackఔʯ·ͰͳΒPHPྑ͍Θ͚Ͱ͢Αɻ• ʢ·͍͔͋ͭͷΓ͔͑ΔͩΖ͏͚Ͳʂʂʣ• ʢπΠοτ2014/01ࠒʣ
• ͍͔ͭPHPΛʮଔۀʯ͢Δձࣾଟ͍Ͱ͠ΐ͏ɺΘ͔Δɻ• ͰɺʮάϫοͬͱΛͭ͘ΔʯͷʹPHP͍ͯͨΓ͠·͢• ʮෛ࠴ʁෛ࠴͕ͳ͍ݴޠͱʁʯ
ͦͯ͠ະདྷ…• PHPͷσεϩʔυײઌͰݮ͖͍ͬͯͯΔ• ͔͠͠ɺϞμϯͳPHPͲ͜ʹ͍Δͷ͔ʁ• ʮࠓ͔ΒʯPHPΛΔҙຯ͕͋Δͷ͔ʁͱ͍͏͝ҙݟ• ʮԿͰ࡞Δ͔ΑΓɺԿΛ࡞Δ͔ͩΖʂʂʯ• ʮPHP͘Β͍ͳΒͰ͖ΔͰ͠ΐʁʯͰਓूΊʢPHP͕Ұ൪͍͠ͱ͍͏Ұ෦ͷ͝ҙݟʣ
https://github.com/blog/2047-language-trends-on-github
༨ஊɿݸਓతͳ࠷͍͔ۙͭ͘ͷଉۤ͠͞• ϞμϯͳWAFɺPSRͳͲͰʮϕετϓϥΫςΟεʯ͕ߴ·Δ• ʮ͜͏͠ͳ͍ͷඍົʯͱ͍͏෩ை• ʮͬͱྑ͍ख๏ʯͷൃ໌ʮγϯϓϧ͞ʯΛԡ͑͞ࠐ·ͳ͍͔ʁ• Έ͕ݮͬͨͷ͔૿͑ͨͷ͔ྑ͘ղΒͳ͍
࣭ٙԠλΠϜ• ͳʹ͔͍͟͝·͔͢ʁ• ແ͚Ε…
͋ͷਓࠓ
HHVM
3ߦͰղΔHHVM• Facebook࡞ͷɺޓੑ͕ߴ͍PHPϥϯλΠϜ• fastCGIɺ·ͨhttpdαʔόͱͯ͠ಈ࡞• Hackͱ͍͏PHPΛຐվͨ͠Ϟμϯ෩ݴޠ͕͑Δ
HHVM Ͳ͏ͳͬͨʁ• ߴԽͱ͍͑HHVMͩͬͨͷͰʁ• PHP7ʹ͕ฒΕͨʢ·͋ɺPHP7·ͩStableग़ͯͳ͍͚Ͳʣ• Hackͱ͍͏ݴޠʁ• গͳ͘ͱɺຊͰϚδͰྲྀߦͬͯͳ͍• ւ֎ͰFBҎ֎Ͱྲྀߦͬͯͳ͍ͷͰ…ʁ
ʔϜ
ݱঢ়• HackݴޠਐԽͯ͠Δ• ଂhttpd͕Ͳ͖ͬͯͨ• όʔδϣϯ݁ߏॱௐʹ্͕͍ͬͯΔ• 3.7>3.8Ͱ5ʙ10%͕͋ͬͨΓͯ͠Δ
ࠓͷॴɺcommitਰ͑ͨΓ͍ͯ͠ͳ͍• ίϛολύοͱݟͰݮ͍ͬͯͳ͍
HHVM,PHP7ʹΑΔڝ૪ʹ͍ͭͯ• ʢڈҐʣʮHHVM͕ઌ佃ΛΓPHP5.xͷഒʹʂʯʢΦΦʔʂ• zend͕ຊؾΛग़ͯ͠ɺPHP7Ͱ͍͍ͭͨ• HHVMҾ͖༷͢ʹؤுͬͯΔ• ʮ݂Ͱ݂Λચ͏ϕϯν߹ઓʯ
ʮͲ͕͍ͬͪͷ͔ʁʯ• PHP7 stable·ͩग़ͯͳ͍ͷͰͳ…• άάΔͱେྔͷαϯϓϧ͕ग़ͯ͘Δ• ߴԽͷख๏͕ҧ͏ͷͰέʔεόΠέʔε• ʮࣗͷίʔυʯͰࢼ͞ͳ͍ͱԿͱݴ͑ͳ͍
ϕϯνϚʔΫɾϓϩύΨϯμ• ͍ΖΜͳਓ͕ʮ͕͍ͬͪ͜ʂʯͱ͍͍ͬͯΔ• ಄ͷάϥϑΛ࠶ܝࡌ
ϓϩύΨϯμࢲײ• ʮϊϯνϡʔϯʯͩͱPHP7͕ଟগ͍ϕϯν͕ଟ͍• ʮνϡʔϯʯ͢ΔͱHHVM͍• νϡʔϯͱɺHackԽɺawaitར༻ͳͲ• ·͋ɺPHP5.6͔ΒͷࠩΛݟΕେࠩͳ͍
ԶతʮͲͬͪΛ͏͖͔ʁʯ in2015• ։ൃຊ൪Linux͔ʁ• ͍͍͑ → PHP• ͍ →• ผʹʁ → PHP• HackΛ͍͍ͨ → HHVM
ʮຊՈPHPʯͷڧ͞• HHVM͕PHPʹ͋ΘͤͯɺPHP͕HHVMʹ߹ΘͤΔٛཧͳ͍• ʢ͍͍ॴ͚ͩύΫΔ࢟• ֤छπʔϧɺIDEɺC֦ுຊՈ͕ୈҰ• Hack·ͩPHPStormͷαϙʔτແ͍ʢࠓޙʁʁʣ• ࠓޙͷ֤σΟετϦඪ४ຊՈPHPͩΖ͏
HHVMͷʢݱঢ়ͷʣඍົ͞• OSXͰʢࠓݱࡏʣϏϧυͰ͖ͳ͍ʢաڈͰ͖ͨʣhttps://github.com/facebook/hhvm/issues/5447ʢBrewͱ͔ʹஆ͔͘ͳ͍ʣ• LinuxͰɺϏϧυ໘ʢಛʹCentOSʣ• UbuntuόΠφϦ༗Γ• ʮHackΛ͏ʯͱɺྲّྀ͕PHPͱҧ͍͗͢Δ
ͭ·Γ• ʮ·͋ɺຊՈPHPΛ͔͓ͭ͏ʯ• ͔͠͠·ͩ·ͩྲྀಈత• Hack͕IDEαϙʔτ͡·ͬͨΒ͏͔ʂ
ҰԠɺHackͷΞπ͞• Hack language• asyncʢMysqlmemcacheʣ• Generics• Type Aliasing• ==> Ͱλ• Type check جຊඞਢhttp://docs.hhvm.com/manual/en/install.hack.bootstrapping.php
HackΛΒͳ͍ਓ͚ɺ==> ʹ͍͚ͭͯͩαϯϓϧfunction l() : (function(int): int) {$a = 1;return $b ==> $a + $b;}$f = l();echo $f(2); // => 3• ΦγϟϨͩ͠ɺʢΑ͘σΟεΒΕΔʣuse͕ෆཁ
ૉͳPHPͰॻ͘ͱ͜͏͍͏ίʔυfunction l() {$a = 1;return function ($b) use ($a){return $a + $b;}}$f = l();echo $f(2); // => 3
ͱ͜ΖͰɺPHP7Ͱʁdeclare(strict_types=1);function l(): Closure {$a = 1;return function (int $b) use ($a) : int{return $a + $b;}}$f = l();echo $f(2); // => 3• ※rc1Ͱuse۟ͷܕએݴ͏͔ͣ͝…
HHVMͷະདྷͲͬͪͩ• ެࣜͳະདྷ͋·Γݟ͑ͳ͍ʁʢPHPRFCΛݟΔͱ͔…ʣ• ͜ͷ··ͰϕλʔPHPͱͯ͠ͷ࠲͕ة͏͍• Ͱ͞ΒʹҾ͖͢ͷ͔ʁ• OSXͰHHVM͕͔ͭ͑ΔΑ͏ʹͯ͠΄͍͠• xhpͳͲͷ֦ுͰReactͳͲͷJSͱྑ͘ͱ͔ͷະདྷʁ
㙽ʹ֯• Έͳ͞ΜPHP͔͍͖ͭͬͯ·͠ΐ͏• PHPਐԽΛ͚͍ͭͮͯ·͢• ͜Θ͘ͳ͍Α!• Ζ͏ʂPHPʂʂʂʂ