$30 off During Our Annual Pro Sale. View Details »

PHP帝国の逆襲!(を願うPHPerが話す最近のPHPについてのクイックツアー PHP7対応版)

uzulla
August 20, 2015
300

PHP帝国の逆襲!(を願うPHPerが話す最近のPHPについてのクイックツアー PHP7対応版)

YAPC::Asia tokyo 2015
uzulla

uzulla

August 20, 2015
Tweet

More Decks by uzulla

Transcript

  1. ̥̝̥ఇࠃͷٯऻʂ
    • ͜ͷτʔΫ͸ϠδOKͰ͢
    • ͜ͷτʔΫ͸স͍ͬͯͩ͘͞
    • υϯυϯֻ͔͖ͬͯͯཉ͍͠

    View Slide

  2. who am i ?
    UZULLA
    PHPer
    Hachioji.pm
    ʮϝʔϧϑΥʔϜΛॻ͍ͯੜ׆ʯ

    View Slide

  3. ΢Σϒք۾Ͱ͸௒
    ༗໊ͳʮPHPʯ
    ͕ɺͲΜͳ΋ͷ͔
    օ͞Μ஌ͬͯ·͢
    ͔ʁ

    View Slide

  4. ͕࣌ؒͳ͍ͷͰ!
    • ڈ೥࿩ͨ͠ʮ൒୺ͳPHPDisʯͰάάͬͯͩ͘
    ͍͞
    • ࡢ೥౓YAPC::AsiaͰҰ൪΢έͨ(?)τʔΫͰ͢
    • ࠷ۙͷPHPͷۃॳาతͳ͜ͱ͸ղΔ͸ͣʢʁʣ
    • https://www.youtube.com/watch?
    v=2tZxNtn0kDc
    • http://www.slideshare.net/junichiishida/
    yapc-2014-phpuzullatalk

    View Slide

  5. ࡾߦͰ
    • PHP͸JavaͱPerlͱHTML/JSΛ·ͥͨΑ͏ͳ
    • ςϯϓϨʔτΤϯδϯͰ͢
    • ʮΏΔ;Θ͆͆͆͆͆ʯ

    View Slide

  6. ʮΏΔ;Θݴޠ͆͆͆ʯ
    • ࠷ۙͷPHP͸ਅ໘໨ʹ͔ͭ͏ͱΏΔ;ΘͰ΋ͳ
    ͍
    • ·͋Ͱ΋ΏΔ;Θʹ΋ॻ͚Δ
    • ੍ࣗ৺Λ΋ͬͯऔΓ૊Ήͷ͕ਖ਼͍͠PHPerͷ
    SUTAIRU

    View Slide

  7. PHPఇࠃͷٯऻ
    • ʮٯऻͷͨΊʹணʑͱྗΛ͔ͨΊͭͭ͋Δ͕ɺ
    ຊฤʹ͸ೖΕͳ͔ͬͨΑ…ʯ
    • ʮ΋ͬͱ͕Μ͹Ζ…ʯ

    View Slide

  8. ʮPHPఇࠃ͸ਓࡐΛืूதͰ
    ͢ʯ
    • Έͳ͞Μʹ΋PHPΛॻ͍ͯ΋Β͍͍ͨ
    • ͦΕ͕ࢲͷ๬ΈͰ͢

    View Slide

  9. ͓඼ॻ͖
    • དྷͨΔ΂͖PHP7ʹ͍ͭͯ
    • PHPͷΤϥʔʹ͍ͭͯ
    • ࠷ۙͷhttpdʹ͍ͭͯ
    • PSR-7ʹ͍ͭͯ
    • ʮ͋ͷਓ͸ࠓʯ

    View Slide

  10. ʮۙະདྷPHPηϒϯʂʯ
    • ʮVarsion 7.0.0ʯ
    • ݱࡏbeta3ɺࠓ೥ͷౙstable༧ఆ
    • PHP6͸ແ͔ͬͨࣄʹʢ৭ʑ͋ͬͨʣ
    • ळʹ͸5.4͸EOL!ɺ5.5΋طʹSecurity fixes
    only
    http://php.net/supported-versions.php

    View Slide

  11. ·ͣ͸

    View Slide

  12. !!!!!!
    RC1 Release
    YEAH!!!!
    !!!!!!

    View Slide

  13. ࡾߦͰղΔPHP7
    • ഒ͘Β͍଎͘ͳͬͨ!
    • ࢖͍ํ΍ߏஙํ๏͸มΘ͍ͬͯͳ͍"
    • จ๏͕ਐԽɺPHPίʔυޓ׵ੑ΋ଟগյΕͨ#
    • ଎͞ͱҾ͖ସ͑ʹC֦ு܈͕க໋ইΛෛͬͨ$

    View Slide

  14. ଎͘ͳͬͨ݅
    • ഒ͘Β͍଎͘ͳͬͨ
    • PHP7 >>>> PHP5.6 > PHP5.5,5.4 >> PHP5.3
    • (HHVM΋)

    View Slide

  15. View Slide

  16. View Slide

  17. View Slide

  18. View Slide

  19. View Slide

  20. View Slide

  21. ग़య
    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_infographic
    http://hhvm.com/blog/9293/lockdown-results-
    and-hhvm-performance
    https://ckon.wordpress.com/2015/08/09/

    View Slide

  22. Կނ଎͘ͳ͔ͬͨʁ
    • ʮ͔ͤͬͭΕͨPHPਞӦ͕ຊؾͩͨ͠ʯ
    • ओʹม਺౳ͷϝϞϦ্ͷߏ଄͕มߋ
    • ʮ΄Μ΋ͷͷ͸͍Εͭʂʯ౳
    • zvalͰάά͍ͬͯͩ͘͞
    • (ͦ΋ͦ΋Զ͕ͦΜͳʹৄ͘͠ͳ͍)
    • ୅ঈͱͯ͠ɺC֦ு͕Ұ୺શ໓ͨ͠ʢޙड़ʣ

    View Slide

  23. ࠓޙ΋଎͘ͳΓͦ͏
    • HHVMͷ༷ͳJITԽΛݟਾ͍͑ͯΔΒ͍͠
    • ASTΛ࡞ΔΑ͏ʹͳͬͨ
    • ͞Βʹ଎౓͕৳ͼΔՄೳੑ

    View Slide

  24. ͸͍
    • ଎͘ͳͬͨ࿩͸Ҏ্Ͱ͢

    View Slide

  25. PHP7Ͱ࢖͍ํ͸มΘ͔ͬͨʁ
    • php-fpmΈ͍ͨͳͷ͕૿͑ͨͱ͔ͦ͏͍͏ͷ͸
    ແ͍ɻ
    • ࠓ·Ͱ௨Γͷmod_php,php-fpm,php(-cgi)
    • Ϗϧυํ๏΋΄΅ಉ͡
    • Stable͕ͰΕ͹ɺී௨ʹaptʹ৐ΔͰ͠ΐ͏
    • yum͸Կ೥ޙͩʁ(Ϩουϋοౘஊ

    View Slide

  26. ҆ఆ͍ͯ͠Δ
    • ͍··Ͱ௨ΓɺԿ΋ߟ͑ͳͯ͘΋མͪͮΒ͍ɻ
    ҆ఆ͍ͯ͠Δɻ
    • ʮPHP͕҆ఆʂʁʂʁʂʁʯ
    • ʮಔᮐύʔιϯʯͱ͍͏ࣾձ࣮ݧ
    • ·͋ɺॏ͘͸ͳΔ͚Ͳͳ͆

    View Slide

  27. httpdपΓͰ͸…
    • ࠷ۙH2Oͱ͍͏httpd͕͋ΒΘΕ·ͨ͠Ͷʂ
    • ผʹPHPͱ͍ؔ͢͝܎͕͋ΔΘ͚Ͱ͸ͳ͍͚Ͳ
    • ͕࣌ؒ༨Ε͹࿩͠·͢ɻ

    View Slide

  28. PHP+httpdʹ͍ͭͯ
    • Apache+mod_php , (Apache+fastCGI)
    • nginx+fastCGI
    • H2O+fastCGI , H2O+CGIϚωʔδϟ
    • nginx+Apache+mod_php

    View Slide

  29. Apache+mod_php
    • mod_phpͱ͍͏మ൘
    • yum΍aptͰೖΔ
    • ΄΅ઃఆϨε͔ɺ.htaccessͰࡁΉ
    • ʢσϑΥϧτͰ͸ʣଟ਺ίωΫγϣϯʹऑ͍
    • ͞ΕͲమ൘

    View Slide

  30. Apacheͷઃఆ
    # httpd.conf౳
    LoadModule php5_module modules/libphp5.so

    SetHandler application/x-httpd-php

    # .htaccess౳
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]

    View Slide

  31. ༨ஊɺҰߦAddHandler͸ηΩϡϦςΟతʹϠό
    ͍
    # httpd.conf౳
    AddHandler php5-script .php
    • Α͘ݟ͔͚Δهड़͕ͩ…
    • http://d.hatena.ne.jp/tmatsuu/
    20150221/1424531513
    • AddHandler͸ผʹʮ֦ுࢠʯͰͳ͍ͷ
    Ͱɺ.php͕ϑΝΠϧ໊Ͳ͜ʹ͸͍ͬͯͯ΋PHP
    ͱͯ͠ղऍ͞ΕΔ᠘

    View Slide

  32. nginx+php-fpm
    • ࠷ۙͷఆ൪͔ʁ
    • ଎౓͸࣮ࡍ଎͍
    • nginx͸ͳΜͰ΋Ͱ͖Δɺຊ౰ʹԿͰ΋ɻ
    • ݁Ռɺઃఆ͸ෳࡶʹͳΓ͕ͪ

    View Slide

  33. nginxͷίϯϑΟάྫ
    index index.php
    try_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;
    }
    • ղΓͮΒ͍ʂʂʂʂʂ
    • ͜Ε͚ͩͰ͸μϝͳࣄ΋͋Δ

    View Slide

  34. nginx͸㙽ʹ֯΍΍͘͜͠ͳΓ͕ͪ
    • FastCgiͷ౎߹Ͱ΋͋Δͷ͚ͩΕͲ…
    • /formͳͲɺPHPϑΝΠϧ໊͕ͳ͍URLΛ࢖͏
    ৔߹…
    • try_filesΛͪΌΜͱཧղ͠ͳ͍ͱμϝ
    • locationΛͪΌΜͱཧղ͠ͳ͍ͱμϝ
    • fastcgiͷύϥϝλΛͪͪ͘͘௥Ճͨ͠Γ
    • PATH_INFOΛͲ͏ੜ੒͢Δ͔Ͱ೰Ή

    View Slide

  35. H2O+fastCGI , H2O+fcgi.spawn
    • ظ଴ͷ৽ਓ
    • http/2
    • ઃఆϑΝΠϧ͕γϯϓϧʂ
    • ͦͷ··Ͱ΋ߴ଎ʢΒ͍͠ʣ
    • ·ͩ஌ݟ͸গͳ͍

    View Slide

  36. h2o+php-fpm
    file.custom-handler:
    extension: .php
    fastcgi.connect:
    host: 127.0.0.1
    port: 9000
    type: tcp
    hosts:
    "doraperson2015.yapcasia.org:443":
    paths:
    /:
    file.dir: /var/www/dora-person-election/app/htdocs
    redirect:
    url: /index.php/
    internal: YES
    status: 307

    View Slide

  37. h2o+php-
    cgi(fastcgi.spawn)
    file.custom-handler:
    extension: .php
    fastcgi.spawn: "PHP_FCGI_CHILDREN=10 exec /path/to/php-cgi"
    • phpϓϩηεͷੈ࿩Λh2oʹ·͔ͤΒΕΔʂ
    • php-fpmෆཁɺ؂ࢹ఺͕ݮΔ!
    • ଎౓΋ɺͺͬͱݟphp-fpmͱḮ৭ͳͦ͞͏
    • php-fpm.confͳͲΛॻ͔ͳͯ͘΋ྑ͍"

    View Slide

  38. h2oॴݟ ྑ͍఺
    • ೔ຊਓͷkazuho͞Μ͕ͭͬͯ͘Δʂʂ
    • ࣭໰͢Δͱɺ͓͑ͯ͘͠Εͯ΍͞͠
    ͍ʂʂʂʂ
    • ଞʹ͘Β΂ɺ࠷௿ݶͷઃఆϑΝΠϧ͸γϯϓϧ
    Ͱ͋Δ
    • ϑΝΠϧ֦ுࢠʹͻ΋͍ͮͯΔͷͰɺ҆શ
    • fastcgi.spawnศརʂʂʂ

    View Slide

  39. h2oॴݟ ଟ෼͜Ε͔Βͷ఺
    • .htaccess͸ແ͍ͷͰɺڽͬͨઃఆͩͱ΍ͬͺ
    Γ௕͍
    • try_filesతͳ֓೦͸Θ͔Βͳ͍ͱ…
    • ͽͪͺʔʹ͸Ϗϧυ͕໘౗
    • yumͱ͔aptͱ͔΄͍͠ΑͶ͆
    • ઃఆͷൿ఻ͷͨΕ͸·ͩগͳΊɺಛʹӡ༻
    • ߏ੒͕গʑಠಛɺinit.dͳͲͲ͏͢Δʁ

    View Slide

  40. ͲΕ͕ྑ͍͔
    • ʮଟগ஗ͯ͘΋άάΕ͹ղܾ͢ΔApacheʯ
    • ʮnginxͷίϯϑΟάɺෳࡶ͗͢ͳ͍ʁʯ
    • ʮH2Oʢ·ͩʣάάͬͯ΋ղܾ͠ͳ͘ͳ͍ʁʯ
    • దࡐదॴ

    View Slide

  41. ༨ஊɺPHP͸ΰϛΛ٧ΊࠐΉจԽʁ͕͋Δ
    • ઃఆ͢ΔػೳຖͰͳ͘ɺΞϓϦຖͰԡ͠ࠐΊΔ
    ͱPHPͬΆ͍
    • .htaccess͸httpdͷઃఆ͔ΒURLϚοϓΛͻ͖
    ͸͕ͯͯ͠ɺָ
    • PHPͷαΠτ͸ࠞࡌʹͳΓ͕ͪɺΠέͯΔํ๏
    ͕ͳ͍΋ͷ͔ͱͳ΍·͍͠ɻ
    • ࠶ىಈ͕ඞཁͰ΋͍͍͔Βɺ.htaccessΈͨ
    ͍ͳͷ͕΄͍͠…

    View Slide

  42. bench
    • έʔεόΠέʔε͗͢Δ…
    • Apacheͷνϡʔϯ͸໘౗
    • nginx͸യવͱ଎͘ͳΔ͕ɺྑ͍ઃఆͰ೰Ή
    • ʮH2O͸ύϥϝλ͕σϑΥϧτͰΠέͯΔʂʯ
    ͱ࡞ऀ͕ओுͯͯ͠੹೚ΛసՇͰ͖Δ(?)

    View Slide

  43. ͞Βʹ༨ஊ
    • PHP͸PaaS΋;͖͑ͯͯ·͢
    • Heroku
    • Azure app service
    • Google App Engine
    • ͍ͣΕ΋ਖ਼ࣜʹʢͱ͸͍͑ɺ·ͩPHP5.5ɺ.
    6͘Β͍ʣ

    View Slide

  44. ͸͍

    View Slide

  45. PHP7ͷඇޓ׵ੑͷ࿩
    • ʮϚΠφʔͰ΋ޓ׵ੑ͕յΕΔࣄʹʢҰ෦Ͱʣ
    ఆධͷ͋ΔPHPʯ
    • ϝδϟʔόʔδϣϯΞοϓͳͷͰ໪࿦յΕͨ!

    View Slide

  46. લ޲͖ͳํͷඇޓ׵ੑʢޙड़͠·͢ʣ
    • େ෺ඇਪ঑ؔ਺͕࣮ࡍʹ࡟আ
    • ϚχΞοΫͳՕॴͷڍಈͷมԽ
    • ࡉ͔͍จ๏ͷඇޓ׵ੑ
    • ༧໿ޠ

    View Slide

  47. ݁ߏ࢒೦ͳํͷඇޓ׵ੑ
    • C֦ு(ॴҦpeclͱ͔)ͷඇޓ׵ੑ
    • gdͱ͔͸͋Δ
    • memcacheʮdʯ͸͋Δ͚Ͳɺmemcache͸
    ͳ͍
    • redisͱ͔ɺQueueܥͱ͔͕ʢ·ͩʣͳ͍
    • PPͷ΋ͷ͸໪࿦(େମ)ಈ͘
    • Release·Ͱʹ͸΋ͬͱ૿͑Δ͸ͣ

    View Slide

  48. ʮ͜ͷઌੜ͖࢒Δʹ͸ʯ
    • ʮC͕Θ͔Βͳ͍PHPer͸଴͔ͭ͠ͳ͍Α
    Ͷ…ʯ
    ʮ͑ͬPHPerͬͯCΘ͔Βͳ͍ͷʁʯ
    • ϝδϟʔॴ͸ϘνϘνରԠ͞Ε͍ͯΔ
    • C֦ுΨϦΨϦॻ͍͖ͯͨํʑ͸ɺ΋͔ͯ͠͠
    ݟ੾ΓͷλΠϛϯά͔΋͠Εͳ͍͆

    View Slide

  49. ʢҰ෦ͷXSΛॻ͘CPANԦαʔͷօ͞Μʣ
    • ʮͲ͔ͬͰฉ͍ͨ͜ͱ͋Δ࿩ͩͳʯ
    • ʮ಺෦APIมΘΔͷɺ͔ͨ͠ͳ͍͚Ͳ΋͎ŵŧƄແ
    ཧ…ʯ

    View Slide

  50. ͸͍

    View Slide

  51. ݴޠͱͯ͠ͷվળ
    • ඇਪ঑ͷ੾Γࣺͯ
    • Type HintingվΊ
    Type declarationsʢܕએݴʣͷڧԽ
    • ΤϥʔͷऔΓѻ͍ͷڧԽ
    • จ๏ͷ௥Ճ

    View Slide

  52. ඇਪ঑ͷ੾Γࣺͯ
    • ‼mysql΍ereg౳ͷϏοάωʔϜ͕͍ͭʹഇࢭ
    • ❗ศར(ҋ)ػೳɺpreg_replaceͷ e(eval)ഇࢭ
    • ❔ݹ୅ͷ=&ɺ<%ʙ%>ɺlanguage=php>ʙͷഇࢭ
    • ͍ͣΕ΋௕͍͜ͱܯࠂࡁΈ
    • 10೥5.3Λ࢖͍ͬͯͯʮϏοά΢Σʔϒʹ৐Ζ
    ͏ͥʂʯͱ͍͏ॴ͕ࢮ͵

    View Slide

  53. Type declarations(ܕએݴ)
    • ݩType Hinting
    • Ҿ਺΍ฦ஋ͷʮܕʯΛࢦఆ
    • ʢPHPͷʮܕʯͰ͢ʣ
    • ʮJava͍ʯ
    • ҧ൓Ͱྫ֎ʢPHP<7͸Τϥʔʣ
    • 7͔ΒεΧϥ஋ΛࢦఆՄೳʹ㊗
    • 7͔Βฦ஋΋ࢦఆՄೳʹ"

    View Slide

  54. ଴๬ͷεΧϥ஋͕ࢦఆՄೳʹʂ
    function func(int $num){
    }
    func('a'); // => TypeError Exception !"
    func('1'); // => OK #$
    • ʮ͔͠͠'1'͸௨Δʯ
    • ʢօ͞ΜʣʮOK͡ΌͶ͑Α͆͜Ε͔ͩΒ
    PHPer͸͆͆͆ʯ

    View Slide

  55. …ͱ͓΋͔ͬͨʁ

    View Slide

  56. strict_types
    declare(strict_types=1); // !
    function func(int $num){ /* ʙ */}
    func('1'); // => TypeError "
    func(1.0); // => TypeError ""
    func(true); // => TypeError """
    • ઌ಄ͷdeclare(strict_types=1);Ͱݫ֨ʹ
    • float=>int❌ͳͷɺڻ͖ͷϚοτ΢ͳڍಈ͆

    View Slide

  57. ͨͩ͠
    • int->floatΩϟετ͸ʮOKʯ
    • ʢ஋͕ܽམ͠ͳ͍͔ΒͩΖ͏ʣ
    • Type declarationsʹΑͬͯɺ༧ظͤ͵ܕΩϟε
    τ͕ൃੜ͢Δ͜ͱ͕…

    View Slide

  58. ࣗಈΩϟετͰ͜Ε͕ΤϥʔʹͳΔ
    func(1); // !΋ͱ΋ͱͷintͳҾ਺͕
    function func(float $num){ // "͜͜ͰfloatʹͳΓ
    func2($num); // #TypeErrorʹͳΔ
    }
    function func2(int $num){ // $func2ͷҾ਺͸intࢦఆͳͷͰ
    }
    • int->float͸Ωϟετ͞ΕΔ!
    • ·͋ɺPHPΒ͍͠Ͱ͢Ͷ"

    View Slide

  59. ͜Ε΋خ͍͠ɺฦ஋΋ࢦఆՄೳ
    function func() : int { // !
    return 1;
    }
    • ࢖Θͳ͍ਓ͸লུ͢Ε͹OK

    View Slide

  60. ࢒೦ʁ஫ҙʁϙΠϯτ
    function func(){
    $a = 1;
    return
    function ()
    use ( int $a ) { // Error
    return $a*2;
    }
    }
    • use۟ʹ͸ʢRC1ͷݱ࣌఺ͰʣܕએݴͰ͖ͳ͍

    View Slide

  61. ʮͱ͜ΖͰɺTypeʹ͸Կ͕ࢦఆͰ͖Δͷʁʯ
    • array
    • callable,Closure(ແ໊ؔ਺)
    • Ϋϥε/ΠϯλʔϑΣΠε
    • int,float,string,bool ㊗௥Ճ

    View Slide

  62. ͜͏͍͏ͷ͸ࢦఆͰ͖ͳ͍
    • ❌ : (function(int): int)
    • (HackͳΒͰ͖Δ)
    • ❌ : \DateTime[]
    • PHPDocͰ͓ͳ͡Έɺཉ͍͠…
    • ❌ : mixed
    • ·͊ɺॻ͔ͳ͚Ε͹౳Ձ

    View Slide

  63. ࢖ͬͨ࣌ɺ଎౓͸Ͳ͏ͳͷʁ
    • ༗Γ 0.4381 sec
    • ແ͠ 0.3516 sec
    • ࠩ 0.0865 sec(86.5ms) / Ұઍສճ
    • MBP i7+PHP7β2Ͱɺ10,000,000(Ұઍສ)ճ͠
    ͯ͜ͷఔ౓
    • (PHPͷ༻్Ͱ͸)࣮༻্ޡࠩͳͷͰؾܰʹ࢖͍
    ͍ͨɻ

    View Slide

  64. ࢼͨ͠ίʔυ
    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ͰࣅͨΑ͏ͳίʔυॻ͍ͨΒ
    ଎౓͕΄΅ಉͩͬͨ͡

    View Slide

  65. ͸͍

    View Slide

  66. க໋తΤϥʔͷϋϯυϦϯά͕Մೳʹ
    ͳͬͨ
    • PHPʹ͸ྫ֎ͱΤϥʔɺೋ͕ͭଘࡏ
    • Τϥʔʹ͸க໋త(Fatal)ͱඇக໋త͕͋Δ
    • க໋తΤϥʔ͸؆୯ʹ͸ϋϯυϧͰ͖ͳ͔ͬͨ
    • PHP7͔Β͸(Ұ෦Λআ͖)Fatal ErrorΛྫ֎Ͱϋ
    ϯυϧՄೳ!
    • https://wiki.php.net/rfc/
    engine_exceptions_for_php7

    View Slide

  67. PHPͷʮExceptionʯ
    • ΈΜͳ͕஌ͬͯΔྫ֎ͦͷ΋ͷ
    • catchͯ͠ճ෮Ͱ͖Δ
    • Θ͔Γ΍͍͢ʂʂ

    View Slide

  68. PHPͷʮΤϥʔʯ
    • ਅ໘໨ʹ࿩͢ͱ30෼Ҏ্͠Ό΂ΕΔͷͰ3ߦͰ
    • શମͰҰݸ͔͠ϋϯυϥΛొ࿥Ͱ͖ͳ͍ྫ֎Έ
    ͍ͨͳ΋ͷ
    • க໋తͳΤϥʔ͸ɺεΫϦϓτΛͦ͜Ͱऴྃ͞
    ͤΔ(ճ෮ෆՄೳ)
    • ྫɿύʔεΤϥʔɺॏෳએݴΤϥʔɺඇଘࡏؔ
    ਺ίʔϧΤϥʔ
    • ʢৄ͖͖͍ͨ͘͠Ͱ͔͢ʁʣ

    View Slide

  69. PHPͷҋਂ͖Errorʹ͍ͭͯ 1
    • Τϥʔ͸ΤϥʔϋϯυϥʹɺίʔϧόοΫؔ਺
    Λొ࿥͢Δ(set_error_handler())͜ͱͰΩϟ
    ονͰ͖Δ
    • ϦΫΤετ಺ͰɺάϩʔόϧͳઃఆͰ͋Δ
    • ྫ֎ͷΑ͏ʹɺ֊૚ԽͰ͖ͳ͍
    • ͭ·Γہॴతͳࠩ͠ସ͑͸Մೳ͕ͩɺඇৗ
    ʹෆศ

    View Slide

  70. PHPͷҋਂ͖Errorʹ͍ͭͯ 2
    • ϋϯυϥΛͰΤϥʔΛΩϟον͢Δͱ…
    • Warnings΍Notice͸ग़ྗ͞Εͳ͍
    • ѲΓͭͿͤΔ
    • E_RECOVERABLE_ERROR͸εΫϦϓτΛऴྃ
    ͠ͳ͍ʢ஫ҙ͕ඞཁʣ

    View Slide

  71. PHPͷҋਂ͖Errorʹ͍ͭͯ 3
    • set_error_handler()Ͱྫ֎ʹม׵͢Δࣄ͕
    Ͱ͖Δ
    set_error_handler(function($errno, $errstr, $errfile, $errline){
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    });

    View Slide

  72. 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";
    }
    }
    );

    View Slide

  73. PHPͷҋਂ͖Errorʹ͍ͭͯ 5
    • ൃੜͨ͠Τϥʔࣗମͷग़ྗઌ͸มߋՄೳ
    • ϒϥ΢βʔ(display_errorsͰOn/Off)
    • ϩάग़ྗ(stderr,syslog,ϑΝΠϧ౳)
    • ͜ͷೋͭ͸ฒྻతͳ෺

    View Slide

  74. PHPͷҋਂ͖Errorʹ͍ͭͯ 6
    • Τϥʔʹ͸୔ࢁछྨ͕͋Δ
    • ඇக໋తͳ΋ͷ
    • E_NOTICEɺE_WARNINGɺ
    E_DEPRECATEDɺ౳…
    • க໋తͳ΋ͷ
    • E_PARSEɺE_ERRORɺ౳…
    • Ͳͬͪͱ΋͍͑ͳ͍΋ͷ

    View Slide

  75. PHPͷҋਂ͖Errorʹ͍ͭͯ 7
    • E_RECOVERABLE_ERROR౳(ޙड़)͸ʮΩϟον͢
    Ε͹ʯͦͷޙ΋࣮ߦͰ͖Δ
    • ྫ͑͹ɺType declarationsͷҧ൓Ͱग़Δ
    • ͜ΕΛΩϟονͯ͠Ͳ͏ʹ͔ͯ͠Δίʔυ
    ݟͨࣄແ͍…

    View Slide

  76. PHPͷҋਂ͖Errorʹ͍ͭͯ 8
    • Τϥʔ͸ઃఆʢϏοτϚεΫʣͰൃੜछྨΛࢦ
    ఆՄೳ
    • error_reporting(0)࠷ڧɺԿ΋ग़ͳ͍
    • ʮக໋తΤϥʔͰ͢Βʂʯ
    • ʮࣗ෼ʯͷύʔεΤϥʔʢE_PARSEʣ͸
    ϜϦ
    • includeͷύʔεΤϥʔ΋௨աͰ͖Δ
    ʢʂʣ

    View Slide

  77. PHPͷҋਂ͖Errorʹ͍ͭͯ 9
    • ѱ໊ߴ͍@͸ɺ؆୯ʹΤϥʔΛ཈੍Ͱ͖Δɺͦ
    ͏ɺFatalͰ΋Ͷʂ
    • ଎౓͸஗͍Ͱ͢ɻ
    • includeͨ͠ϑΝΠϧͷύʔεΤϥʔ
    ʢE_PARSEʣ͸ϜϦ
    • error_reporting(0)ͷํ͕ͭΑ͍

    View Slide

  78. PHPͷҋਂ͖Errorʹ͍ͭͯ 10
    • ༨ஊɿPHPʹ͸ʢࠓݱࡏʣίϯύΠϧϑΣʔζ
    ͸ͳ͍

    View Slide

  79. PHPͷҋਂ͖Errorʹ͍ͭͯ 11
    • ඇக໋ͷNotice,Warning͸ऴྃ͠ͳ͍
    • Τϥʔ͕ग़ྗ͞ΕΔ͚ͩ
    • ѱ໊ߴ͍ʮը໘ʹग़ΔΤϥʔʯ
    • ʢॳ৺ऀʣʮઃఆΛίϐϖͨ͠ΒΤϥʔ͕
    ͚ͤ·͢ʂʯˠ(ݟ͑ͳ͘ͳ͚ͬͨͩ)

    View Slide

  80. PHPͷҋਂ͖Errorʹ͍ͭͯ 12
    • use strict;͕ཉ͍͠…
    • ͨͩɺʹͨΑ͏ͳ෺͸࡞ΕΔ
    • http://uzulla.hateblo.jp/entry/
    2013/12/20/041619

    View Slide

  81. PHPͷҋਂ͖Errorʹ͍ͭͯ 13
    • 㙽ʹ֯ʂ
    • க໋తΤϥʔ͸͜Ε·Ͱ෮ؼͰ͖ͳ͔ͬͨ❗
    • ྫɿଘࡏ͠ͳ͍ؔ਺ίʔϧɺએݴͷॏෳͳ
    Ͳ

    View Slide

  82. ௕͘ଓ͍͖ͯͨ(99%ͷਓ͸ࠔͬͯͳ͍)໰୊
    • ଞͷݴޠΑΓக໋తΤϥʔͷൣғ͕ͪΐͬͱ޿
    ͍
    • ͋·Γeval͕ಘҙͰ͸ͳ͍
    • க໋తΤϥʔ͸ϦΧόϦͰ͖ͳ͍
    • σετϥΫλ΋ݺ͹Εͳ͍
    • ʮന͍ը໘(ಥવࢮ)ʯΛճආ͠ɺจ຺ʹԠͨ͡
    Τϥʔը໘Λ͢Δͷ͕ͪΐ͍໘౗

    View Slide

  83. PHP7͔Β͸ɺக໋తΤϥʔ΋ྫ֎ͰϦΧόϦʔ
    Ͱ͖Δ
    • \Error ΫϥεΛ਌ͱͨ͠Ϋϥε͕ྫ֎Ͱ౤͛
    ΒΕΔ
    • க໋తͳΤϥʔͷʮେମશ෦ʯ͕ʮྫ֎ʯʹͳ
    Δ
    • ͳͬͯͳ͍ॴ΋͋Δʢྫɿ࠷ॳͷίʔυͰ
    ͸ύʔεΤϥʔΩϟονෆೳ౳ʣ
    • ࠷ޙ·ͰΩϟον͞Εͳ͔ͬͨྫ֎͸ैདྷͷΤ

    View Slide

  84. ͜ΕʹΑͬͯ
    • PHP͕஍ຯʹෆಘҙͳʮΧοίΠΠ500ʯ͕ग़
    ͠΍͘͢ͳΔʢ͔ͳʣ
    • ϝλ͍ίʔυΛॻ͍ͨͱ͖ɺଈࢮ͢ΔՄೳੑΛ
    ݮΒͤΔ(ؾ͕͢Δ)
    • ίʔϧόοΫؔ਺Λଟ༻͢Δͱ͖ͱ͔ศརʢͦ
    ͏ʣ
    • σʔϞϯͳͲΛॻ͖΍͘͢ͳΔʢ͔ͳʣ

    View Slide


  85. try{
    ଘࡏ͠ͳ͍ؔ਺();
    }catch(\Excepion $e){
    // ௨ৗͷྫ֎͸͜͜ʹ
    }catch(\Error $e){
    // ৽͍͠ɺΤϥʔʢͷྫ֎ʣ͸͜͜ʹ
    }
    // PHP<7 ͸͜͜ʹ͘Δ͜ͱ͸ෆՄೳ

    View Slide

  86. ஫ҙ఺
    • NoticeɺWarning͸ྫ֎ʹʮͳΒͳ͍ʯ
    • ྫ֎ΛΩϟον͠ͳ͍Ͱऴྃ͢Δͱɺطଘ
    ίʔυΛյͪ͠Ό͏
    • ͭ·Γʮେ౷ҰΤϥʔϋϯυϦϯάʯͰ͸ͳ͍
    • ࠓ·Ͱ௨Γset_error_handlerͰྫ֎ʹม
    ׵͸Մೳɺ͕Μ͹Εʂ

    View Slide

  87. ઌऔΓDisΓ৘ใɺΤϥʔฤ
    • PHPer͸ΏΔ;ΘͳͷͰ catch(\Exception
    $e) ͱ͔͍͏ϫΠϧυΧʔυΛ࢖͍͕ͪ
    • ҆қʹ\Exception ͷαϒΫϥεͰΤϥʔͷྫ
    ֎Λੜ΍͢ͱʮΏΔ;ΘPHPerͷ໋͕Ϡό͍ʯ
    • ݁Ռɺ\Exceptionͷ͞Βʹ਌Ϋϥεͱͯ͠
    \Throwable͕Ͱ͖ͨɻ\Error͸\Throwable
    ͷࢠʹɻ

    View Slide

  88. ࣮͸
    • ͱ͜ΖͰɺ࣮͸\ErrorExceptionͱ͍͏ྫ֎
    ͸͢Ͱʹ͋Δ
    • ʮPHPͷݩ͔Β͋ΔErrorͱɺErrorͱ͍͏৽
    ͍͠ྫ֎ΫϥεͱɺErrorExceptionͱ͍͏ྫ
    ֎Ϋϥε͕ࠞࡏʯ
    • ͍ͩ͆͆͆͞
    • ʢ͜͜͸Beta1͋ͨΓͰRFC͔Β͍͖ͳΓ࢓༷
    ͕͔ΘͬͨͷͰɺ·ͨมΘΔ͔΋ʣ

    View Slide

  89. ʮࠓޙ༧૝͞ΕΔະདྷʯ
    • ʮφϧϗυʂʂࠓޙ͸catch(\Throwable $e)
    ͔͚ͬͯ͹͍͍ΜͩͶʂʂʯ
    • ʮ!ʯ
    • ʢerror_reporting(0)ͬͯॻ͍ͯΔਓ΋͍Δ
    ͔Βɺ͋ͳ͕ͪ৑ஊͰ΋ͳ͍ʢഭਅʣʣ

    View Slide

  90. ͸͍

    View Slide

  91. จ๏ͷ௥Ճ
    • ??ԋࢉࢠ(isset͔Βͷ։์ʣ΍<=>ԋࢉࢠ
    • ແ໊Ϋϥεͷ௥Ճ

    View Slide

  92. ??ԋࢉࢠ
    • ΈΜͳେ޷͖isset͔Βͷ୤٫
    if(isset($_GET['name']))
    $name = $_GET['name'];
    else
    $name = 'anonymous';
    !
    $hoge = (isset($_GET['name'])) ?
    $_GET['name'] : 'anonymous';
    !
    $name = $_GET['name'] ?? 'anonymous' ;
    • ??͸ະఆٛม਺ʹ৮ͬͯ΋େৎ෉Ͱ͢ɺศ
    རʂʂʂʂ

    View Slide

  93. <=> 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"];
    });

    View Slide

  94. ෳ਺ΧϥϜ΋ࢦఆͰ͖·͢
    usort($item_list, function ($left, $right) {
    return
    [$left["id"], strlen($left["name"])]
    <=>
    [$right["id"], strlen($right["name"])]
    ;
    });
    • ͜Ε͸SQLͷෳ਺ORDERͬΆͯ͘ศརͬΆ͍

    View Slide

  95. ແ໊Ϋϥε
    • ΠϯϥΠϯͰɺଈ࣌ʹΠϯελϯεੜ੒Ͱ͖Δ
    • DI౳Ͱɺͦͷ৔ͰΧδϡΞϧʹΠϯελϯεڍ
    ಈΛม͑ΒΕͯศར…͔ͳ
    • (DIͱ͔͔͍ͯ·͢ͷ͕ɺʮਖ਼͍͠DIʯʹ͍ͭ
    ͯ͸צห͍ͯͩ͘͠͞)

    View Slide


  96. $app->setLogger(
    new class extends \My\Logger {
    public function emergency(
    $message,
    array $context = []
    ){
    \My\AlertPush($message);
    parent::emergency($message, $context);
    }
    }
    );
    • ͜Ε͸֦ுͯ͠Δ͚ͲɺѲΓͭͿ࣌͢ͱ͔ʢʣ
    ʹ΋࢖͑ͦ͏Ͱ͢Ͷ

    View Slide

  97. ༧໿ޠ͕௥Ճ
    • Ϋϥε໊/ΠϯλʔϑΣΠε໊
    • ஍ຯʹΠϯύΫτ͕͋Δ
    • int, float, bool, string, true, false, null, resource,
    object, mixed, numeric
    • Ұ෦ͷWAFʹ͸ɺStringͱ͍͏Ϋϥε͕…

    View Slide

  98. PHP7ͷIDEͷରԠ!

    View Slide

  99. ͸͍
    • ·͋ɺΦγϟϨʹͳΓ·͢Ͷ
    • ແ໊Ϋϥε࢖͍·͘ΔͱίʔυδϟϯϓͰ͖ͳ
    ͘ͳΓͦ͏ͳͷͰ΄Ͳ΄Ͳʹ͢Δ༧ఆͰ͢
    • ༧໿ޠʹΑͬͯ஍ຯʹಈ͔ͳ͍ΞϓϦ͕͋Δ…

    View Slide

  100. ੝Γ্͕Γ
    • ਐΉίϯϙʔωϯτԽ
    • PSR-7ʢ…͕͜Ε͔Β͘Δʁʣ
    • ʮϏοάϓϨΠϠʔʯ

    View Slide

  101. ίϯϙʔωϯτԽ
    • PSR-0,4 ͱComposerͷීٴͰී௨ͷݴޠͬΆ
    ͘ͳΓ…
    • ୯ମͷORMɺϧʔλʔɺςϯϓϨʔτɺDI׆
    ༻͕׆ൃʹͳΓ…
    • Symfony, Aura, Zend Framework
    • ʮΦϨΦϨWAFେ޷͖ʂʂʯͳਓʹ͸࠷ߴ

    View Slide

  102. ʮϑϨʔϜϫʔΫ͸ࢮΜͰ͍ͳ͍ʯ
    • 0͔Β૊·Εͨൿ఻ͷϑϨʔϜϫʔΫ΍ɺڊେ
    ͳϞϊγϦοΫϑϨʔϜϫʔΫ͔Βͷ୤٫…
    ͱɺ͍͏ײ͡Ͱ͸ͳ͍ɻ
    • ݁ہͦΕΒΛ͔ͭͬͨϏοάFW͕࢖ΘΕͯΔ
    • ͦΕΒͷதͰίϯϙʔωϯτΛ͔͍ͭͬͯͯ
    ΋ɺ݁ہδϟΠΞϯτϦʔϓ͸ൃੜ͢Δ

    View Slide

  103. ͦΜͳࡢࠓɺྲྀߦΓͦ͏ͳPSR-7
    • HTTPϝοηʔδΫϥεɺrequest/response
    • perlͰ͍͏ HTTP::Request΍ɺJavaͰ͍͏
    ServletΈ͍ͨͳͷ͕ཉ͍͠ɺͱ͍͏ྲྀΕʢࠓ
    ·Ͱ͸FW͕Ί͍Ί͍ʹ΍ͬͯͨʣ
    • PHPࣗମͷػೳͰ͸ͳ͍͠ɺinterfaceͰ͔͠ͳ
    ͍

    View Slide

  104. ʮPSRͬͯʁʯ
    • ༗ࢤʹΑΔɺ۩ମతͳઃܭ࢓༷ͷఏҊ
    • ΦʔτϩʔυͷϑΝΠϧܗࣜɺϩΨʔAPI౳
    • ͋͘·Ͱ༗ࢤͷఏҊͰɺʮ๏ʯͰ͸ͳ͍
    • ੈل຤ౖΓͷPHPσεϩʔυʹடং͕(ը૾ུ)
    • ڈ೥ͷࢲͷൃදΛݟ͍ͯͩ͘͞

    View Slide

  105. PSR-7ͷϝϦοτ
    • PHPಠಛͳɺάϩʔόϧม਺͞ΘΓ·͘Γੈք
    ʢ$_GET, $_POSTͳͲʣ͔Βͷ୤٫(ʁ)
    • ஍ຯʹ໘౗ͳ$_FILESͱ͔ΛOOPతʹ৮ΕΔ
    • ͪΌΜͱ࣮ͨ͠૷ͳΒɺʮob_*ʯΛۦ࢖͢Δ
    ඞཁ͸ݮΔ(ޙड़)

    View Slide

  106. • ൚༻Mock͕࡞Γ΍͘͢ͳΓςελϒϧɺαϒ
    ϦΫΤετͱ͔͠΍͍͢ʢ͔΋ʣ
    • Plack::Middleware Έ͍ͨͳ΋ͷ͕ͭ͘ΕΔΑ
    ͏ʹͳΔ͸ͣ
    • ϦΫΤετͷϩΪϯά΋͠΍͘͢ͳΔ͸ͣ
    • reactPHPͳͲɺPHPͰॻ͔Εͨhttpd͕ॻ͖΍
    ͘͢ͳΔʢؾ͕͢Δʣ

    View Slide

  107. σϝϦοτ΍஫ҙ఺
    • ੜ$_POSTɺੜechoͷํ͕଎͍
    • ૉखͰ͞ΘΔʹ͸େ෼ੜͳAPIʢWAF͕Ӆṭ͢
    ΔͩΖ͏͚Ͳʣ
    • $_SESSION͸ʮؚ·Εͳ͍ʯ!
    • $_POST౳͸ʮӅͤͳ͍ʯɺੜecho͢Δͱग़ͪ
    Ό͏ɺ؆୯ʹҳ୤Ͱ͖ΔʢٻΊΒΕΔ੍ࣗ৺ʣ

    View Slide

  108. ڍಈ͸࣮૷࣍ୈͳͷͰ…
    • ࢓༷௨ΓͪΌΜͱ࣮૷͢Δͷେมͦ͏
    • ʮob_*Λීஈ͔Β͔͍ͭ͜ͳ͠ɺόΧͰ͔͍
    CSVΛग़ྗ͍ͯ͠Δօ͞·ʯ͸ɺΠϯελϯε
    ʹϨεϙϯεΛͨΊࠐΉࣄʹջٙతͰ͠ΐ͏ɻ
    ࣮ࡍɺμϝͳ࣮૷΋ʮՄೳͰ͢ʯɻ
    • ʮॻ͖ग़ͯ͠಺෦ϦμΠϨΫτ͠Α͏ʯ
    ʮੈͷதʹ͸apache+mod_php͔͠ͳ͍ਓ΋
    ͍ΔΜͰ͢Αʂʯ

    View Slide

  109. My fav WAFͰ͋ΔSlim3ͷPSR-7࣮૷Ͱ͸
    • php://tempΛ͔͍ͭͬͯͨ
    • PHP૊ΈࠐΈͷετϦʔϜϥούʔ
    • ΦϯϝϞϦʹอ࣋͠ɺσϑΥϧτͰ͸2MB
    Λ௒͑ΔͱཪͰϑΝΠϧʹॻ͖ग़͢

    View Slide

  110. ༨ஊ:"Stream"ͷଟ༻ʹ͍ͭͯ
    • αΠζ͕༧૝ͮ͠Β͍bodyΛѻ͏ͨΊʹ
    Stream͕࢖ΘΕΔࣄ͕ଟ͍໛༷
    • ΧδϡΞϧʹม਺Λ࢖͍͍ͨPHPerʹ͸໘౗͆
    • WAFʹӅṭ͞ΕΔͷͰɺීஈ͸ҙࣝ͠ͳͯ͘
    ΋ྑ͍͕ɺ଎౓͕ෆ҆
    • ͪͳΈʹ$HTTP_RAW_POST_DATA͸PHP7Ͱແ͘
    ͳΔɻphp://inputΛ͔ͭ͏͔͠ͳ͍ʢͦͯ͠
    ͜Ε͸multipartͰ͸͔ͭ͑ͳ͍ͷͰɺྗۀͰ౷

    View Slide

  111. PSR-7ͷ࣮૷Λ͍͔ͭ͘ݟͨײ૝
    • ݱঢ়WAF͕Ί͍Ί͍ʹ࣮૷͍ͯ͠Δ
    • ͳ͔ͳ͔టष͍͜ͱΛ΍͍ͬͯΔɺΤοδέʔ
    ε͋Γͦ͏…
    • ಠࣗContent-typeͱ͔ߟ͑ͯͳ͍Ϡπ΋͋Δͬ
    Ά͍
    • ͍͖ͳΓ͜ΕΛ଍৔ʹ͢Δͷ͸ෆ҆

    View Slide

  112. ʮPSR-7͸ඞਢ͔ʁʯ
    • ྫྷ੩ʹ͍͑͹ɺNo
    • ৽͍͠ࣄ͕Ͱ͖ΔΘ͚Ͱ͸ͳ͍
    • ͔͠͠ΦγϟϨ…ςετ͠΍ͦ͢͏…઀͗໦͠
    ΍ͦ͢͏…
    • ʢࢲ͸ੈؒ஌ΒͣͳͷͰɺ͜͏͍͏෺ʹὃ͞Ε
    ΍͍͢ʣ

    View Slide

  113. ༨ஊ
    • ʮαʔϒϨοτ͡ΌΜʯʮ͸͍ʯ
    • ʮ͜ͷձ৔ʹ஌ݟ͋;ΕΔํ͸͍Βͬ͠Ό͍·
    ͤΜ͔ɺཔΉྑ͍PSR-7࣮૷Λ࡞ͬͯ͘Εʯ
    • ʮPHPͰॻ͔Εͨhttpdͷ࣌୅͕͘Δʂʯʢͱ
    ͍͏ئ๬ʣ

    View Slide

  114. ͸͍

    View Slide

  115. ϓϨΠϠʔͷ࿩
    • ʮPHPͳΜͯͩΕ΋͔ͭͬͯͳ͍Ͱ͠ΐ͆͆
    ͆ʯ
    • ʮΠέͯΔاۀ΋PHP͔ͭͬͯΔͧʂʂʯ
    • ʮ·ͩFacebookཔΈʁ͆͆ʯ

    View Slide

  116. ϝϧΧϦ༷
    • YAPCεϙϯαʔͰ΋͋ΒΕΔ

    View Slide

  117. ಔᮐύʔιϯ

    View Slide

  118. ҧ͏

    View Slide

  119. • chatwork…͸୤PHPͰScala΁…

    View Slide

  120. πΠΩϟεʂ
    • BUT… ʮେମCͰॻ͍ͯΔʯʢࣾ௕͞Μஊʣ
    • ͸ͨͯ͠PHP7ʹҠߦ͢Δͷ͔…ʁ

    View Slide

  121. ͍΍͍΍ɺ͋ͦ͜΋PHPͰ͢Αʁ

    View Slide

  122. slack!!!

    View Slide

  123. Slack
    • https://twitter.com/SlackHQ/status/
    426469205005705217
    • PHP͸slack΋͔ͭͬͯΔʂʂʢ/index.phpɺ
    ͕͋ΔͬΆ͍ʂʣ
    • ʮslackఔ౓ʯ·ͰͳΒPHP͸ྑ͍Θ͚Ͱ͢Αɻ
    • ʢ·͍͔͋ͭ͸ͷΓ͔͑ΔͩΖ͏͚Ͳʂʂʣ
    • ʢπΠοτ͸2014/01ࠒʣ

    View Slide

  124. • ͍͔ͭ͸PHPΛʮଔۀʯ͢Δձࣾ΋ଟ͍Ͱ͠ΐ
    ͏ɺΘ͔Δɻ
    • Ͱ΋ɺʮάϫοͬͱ෺Λͭ͘ΔʯͷʹPHP͸޲
    ͍ͯͨΓ΋͠·͢
    • ʮෛ࠴ʁෛ࠴͕ͳ͍ݴޠͱ͸ʁʯ

    View Slide

  125. ͦͯ͠ະདྷ΁…
    • PHPͷσεϩʔυײ͸ઌ୺Ͱ͸ݮ͖͍ͬͯͯΔ
    • ͔͠͠ɺϞμϯͳPHP͸Ͳ͜ʹ͍Δͷ͔ʁ
    • ʮࠓ͔ΒʯPHPΛ΍Δҙຯ͕͋Δͷ͔ʁͱ͍͏
    ͝ҙݟ
    • ʮԿͰ࡞Δ͔ΑΓɺԿΛ࡞Δ͔ͩΖʂʂʯ
    • ʮPHP͘Β͍ͳΒͰ͖ΔͰ͠ΐʁʯͰਓूΊ
    ʢPHP͕Ұ൪೉͍͠ͱ͍͏Ұ෦ͷ͝ҙݟʣ

    View Slide

  126. https://github.com/blog/2047-language-trends-
    on-github

    View Slide

  127. ༨ஊɿݸਓతͳ࠷͍͔ۙͭ͘ͷଉۤ͠
    ͞
    • ϞμϯͳWAFɺPSRͳͲͰʮϕετϓϥΫςΟ
    εʯ͕ߴ·Δ
    • ʮ͜͏͠ͳ͍ͷ͸ඍົʯͱ͍͏෩ை
    • ʮ΋ͬͱྑ͍ख๏ʯͷൃ໌΍ʮγϯϓϧ͞ʯΛ
    ԡ͑͞ࠐ·ͳ͍͔ʁ
    • ೰Έ͕ݮͬͨͷ͔૿͑ͨͷ͔ྑ͘ղΒͳ͍

    View Slide

  128. ࣭ٙԠ౴λΠϜ
    • ͳʹ͔͍͟͝·͔͢ʁ
    • ແ͚Ε͹…

    View Slide

  129. ͋ͷਓ͸ࠓ

    View Slide

  130. HHVM

    View Slide

  131. 3ߦͰղΔHHVM
    • Facebook࡞ͷɺޓ׵ੑ͕ߴ͍PHPϥϯλΠϜ
    • fastCGIɺ·ͨ͸httpdαʔόͱͯ͠ಈ࡞
    • Hackͱ͍͏PHPΛຐվ଄ͨ͠Ϟμϯ෩ݴޠ͕
    ࢖͑Δ

    View Slide

  132. HHVM Ͳ͏ͳͬͨʁ
    • ߴ଎Խͱ͍͑͹HHVMͩͬͨͷͰ͸ʁ
    • PHP7ʹ଎౓͕ฒ͹Εͨʢ·͋ɺPHP7͸·
    ͩStableग़ͯͳ͍͚Ͳʣ
    • Hackͱ͍͏ݴޠ͸ʁ
    • গͳ͘ͱ΋ɺ೔ຊͰ͸ϚδͰྲྀߦͬͯͳ͍
    • ւ֎Ͱ΋FBҎ֎Ͱ͸ྲྀߦͬͯͳ͍ͷͰ
    ͸…ʁ

    View Slide

  133. ΢ʔϜ

    View Slide

  134. ݱঢ়
    • Hackݴޠ͸ਐԽͯ͠Δ
    • ಺ଂhttpd͕΋Ͳ͖ͬͯͨ
    • όʔδϣϯ΋݁ߏॱௐʹ্͕͍ͬͯΔ
    • ଎౓΋3.7>3.8Ͱ5ʙ10%͕͋ͬͨΓͯ͠Δ

    View Slide

  135. ࠓͷॴɺcommit͸ਰ͑ͨΓ͸͍ͯ͠
    ͳ͍
    • ίϛολ΋ύοͱݟͰݮͬͯ͸͍ͳ͍

    View Slide

  136. HHVM,PHP7ʹΑΔ଎౓ڝ૪ʹ͍ͭ
    ͯ
    • ʢڈ೥ҐʣʮHHVM͕ઌ佃Λ੾ΓPHP5.xͷഒ
    ʹʂʯʢ΢ΦΦʔʂ
    • zend͕ຊؾΛग़ͯ͠ɺPHP7͸଎౓Ͱ௥͍͍ͭ
    ͨ
    • HHVM΋Ҿ͖཭༷͢ʹؤுͬͯΔ
    • ʮ݂Ͱ݂Λચ͏ϕϯν߹ઓʯ

    View Slide

  137. ʮͲ͕ͬͪ଎͍ͷ͔ʁʯ
    • PHP7 stable͸·ͩग़ͯͳ͍ͷͰͳ…
    • άάΔͱେྔͷαϯϓϧ͕ग़ͯ͘Δ
    • ߴ଎Խͷख๏͕ҧ͏ͷͰέʔεόΠέʔε
    • ʮࣗ෼ͷίʔυʯͰࢼ͞ͳ͍ͱԿͱ΋ݴ͑ͳ͍

    View Slide

  138. ϕϯνϚʔΫɾϓϩύΨϯμ
    • ͍ΖΜͳਓ͕ʮ͕ͬͪ͜଎͍ʂʯͱ͍͍ͬͯΔ
    • ๯಄ͷάϥϑΛ࠶ܝࡌ

    View Slide

  139. View Slide

  140. View Slide

  141. View Slide

  142. View Slide

  143. View Slide

  144. View Slide

  145. View Slide

  146. ϓϩύΨϯμࢲײ
    • ʮϊϯνϡʔϯʯͩͱPHP7͕ଟগ଎͍ϕϯν
    ͕ଟ͍
    • ʮνϡʔϯʯ͢ΔͱHHVM΋଎͍
    • νϡʔϯͱ͸ɺHackԽɺawaitར༻ͳͲ
    • ·͋ɺPHP5.6͔ΒͷࠩΛݟΕ͹େࠩ͸ͳ͍

    View Slide

  147. ԶతʮͲͬͪΛ࢖͏΂͖͔ʁʯ in
    2015
    • ։ൃ΋ຊ൪΋Linux͔ʁ
    • ͍͍͑ → PHP
    • ͸͍ →
    • ผʹʁ → PHP
    • HackΛ࢖͍͍ͨ → HHVM

    View Slide

  148. ʮຊՈPHPʯͷڧ͞
    • HHVM͕PHPʹ͋Θͤͯ΋ɺPHP͕HHVMʹ߹
    ΘͤΔٛཧ͸ͳ͍
    • ʢ͍͍ॴ͚ͩύΫΔ࢟੎
    • ֤छπʔϧɺIDEɺC֦ு΋ຊՈ͕ୈҰ
    • Hack͸·ͩPHPStormͷαϙʔτແ͍ʢࠓ
    ޙ΋ʁʁʣ
    • ࠓޙͷ֤σΟετϦඪ४΋ຊՈPHPͩΖ͏

    View Slide

  149. HHVMͷʢݱঢ়ͷʣඍົ͞
    • OSXͰʢࠓݱࡏʣϏϧυͰ͖ͳ͍ʢաڈ͸Ͱ
    ͖ͨʣ
    https://github.com/facebook/hhvm/issues/
    5447
    ʢBrewͱ͔ʹ΋ஆ͔͘͸ͳ͍ʣ
    • LinuxͰ΋ɺϏϧυ͸໘౗ʢಛʹCentOSʣ
    • Ubuntu͸όΠφϦ഑෍༗Γ
    • ʮHackΛ࢖͏ʯͱɺྲّྀ͕PHPͱҧ͍͗͢Δ

    View Slide

  150. ͭ·Γ
    • ʮ·͋ɺຊՈPHPΛ͔͓ͭ͏ʯ
    • ͔͠͠·ͩ·ͩྲྀಈత
    • Hack͕IDEαϙʔτ͸͡·ͬͨΒ࢖͏͔΋ʂ

    View Slide

  151. ҰԠɺHackͷΞπ͞
    • Hack language
    • asyncʢMysql΍memcacheʣ
    • Generics
    • Type Aliasing
    • ==> Ͱλ
    • Type check جຊඞਢ
    http://docs.hhvm.com/manual/en/
    install.hack.bootstrapping.php

    View Slide

  152. HackΛ஌Βͳ͍ਓ޲͚ɺ==> ʹ͍ͭ
    ͚ͯͩαϯϓϧ
    function l() : (function(int): int) {
    $a = 1;
    return $b ==> $a + $b;
    }
    $f = l();
    echo $f(2); // => 3
    • ΦγϟϨͩ͠ɺʢΑ͘σΟεΒΕΔʣuse͕ෆ

    View Slide

  153. ૉ๿ͳPHPͰॻ͘ͱ͜͏͍͏ίʔυ
    function l() {
    $a = 1;
    return function ($b) use ($a){
    return $a + $b;
    }
    }
    $f = l();
    echo $f(2); // => 3

    View Slide

  154. ͱ͜ΖͰɺ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۟ͷܕએݴ͸͏͔ͣ͝…

    View Slide

  155. HHVMͷະདྷ͸Ͳͬͪͩ
    • ެࣜͳະདྷ͸͋·Γݟ͑ͳ͍ʁʢPHP͸RFCΛ
    ݟΔͱ͔…ʣ
    • ͜ͷ··Ͱ͸ϕλʔPHPͱͯ͠ͷ࠲͕ة͏͍
    • ଎౓Ͱ͞ΒʹҾ͖཭͢ͷ͔ʁ
    • OSXͰ΋HHVM͕͔ͭ͑ΔΑ͏ʹͯ͠΄͍͠
    • xhpͳͲͷ֦ுͰReactͳͲͷJSͱ஥ྑ͘ͱ͔
    ͷະདྷ͸ʁ

    View Slide

  156. ͸͍

    View Slide

  157. 㙽ʹ֯
    • Έͳ͞ΜPHP΋͔͍͖ͭͬͯ·͠ΐ͏
    • PHP΋ਐԽΛ͚͍ͭͮͯ·͢
    • ͜Θ͘ͳ͍Α!
    • ΍Ζ͏ʂPHPʂʂʂʂ

    View Slide