Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ハイパフォーマンスPHPアプリケーション(への道)

F4d37a67ce86b2f962c79d73a9127d3c?s=47 fortkle
April 14, 2016

 ハイパフォーマンスPHPアプリケーション(への道)

ハイパフォーマンスを目指すにあたって誰もが知っておきたい基本的なところをまとめました。

F4d37a67ce86b2f962c79d73a9127d3c?s=128

fortkle

April 14, 2016
Tweet

Transcript

  1. ϋΠύϑΥʔϚϯε
 PHPΞϓϦέʔγϣϯ(΁ͷಓ) ߴ໺ ෱ߊ @fortkle - PHP7 Casual Talks #2

  2. ࣗݾ঺հ • @fortkle • ੜਮͷPHPer • ݩʑLaravelਪ͠ͷݱࡏCakePHPer • ۙگɿ͜͜1िؒɺίʔσΟϯάத͸ͣͬͱ
 ɹɹɹᓏࡔ46ͷʮαΠϨϯτϚδϣϦςΟʔʯͷϧʔϓ

    • Connehito גࣜձࣾͰΤϯδχΞ
  3.  ϝσΟΞ ϢʔβʔࢀՃܕΞϓϦ mamari jp mamari Q ϚϚͷ 3ਓʹ1ਓ ͕ར༻ʂ

    ࢀরɿGoogle Analytics ݄ؒར༻ऀ 400ສਓ Ҏ্ ʮਓͷੜ׆ʹͳͯ͘͸ͳΒͳ͍ʯαʔϏεΛ૑Δ
  4. “ύϑΥʔϚϯε”

  5. ύϑΥʔϚϯε͸Ϗδωεʹ Өڹ͢Δ • Amazon : ϖʔδͷԠ౴଎౓͕0.1ඵݮΔͱച্͕1% ૿Ճͨ͠ • Google :

    ϖʔδͷԠ౴଎౓͕2%஗͘ͳΔͱɺϢʔ βʔຖͷݕࡧߦಈ͕2%ݮগͨ͠ • Yahoo! : ϖʔδͷԠ౴଎౓Λ0.4ඵ୹ॖ͢Δͱɺτϥ ϑΟοΫ͕9%૿Ճͨ͠ http://radar.oreilly.com/2008/08/radar-theme-web-ops.html http://assets.en.oreilly.com/1/event/29/Keynote%20Presentation%202.pdf http://www.slideshare.net/stoyan/dont-make-me-wait-or-building-highperformance-web-applications#btnNext
  6. ύϑΥʔϚϯε = Ԡ౴଎౓?

  7. ύϑΥʔϚϯεͱ͸Կ͔ʁ • ϋΠύϑΥʔϚϯε = ʮظ଴Ҏ্ͷੑೳΛ্ ͍͛ͯΔ͜ͱʯ • ύϑΥʔϚϯε͸ʮԠ౴଎౓ʯ͚ͩͰ͸ͳ͍ • ʮੑೳʯ͸ཁ݅ఆٛ͠ʹ͍͘

    • ϏδωεʹӨڹ͢Δͷʹܰࢹ͞Ε͕ͪ
  8. ੑೳΛ͋ΘΒ͢ʮ඼࣭ಛੑʯ • ʮੑೳʯ͸ཁ݅ఆٛ͠ʹ͍͘ • ιϑτ΢ΣΞςετͷੈքʹʮ඼࣭ಛੑʯͱ͍͏ج४͕͋Δ • ػೳੑɺ৴པੑɺޮ཰ੑɺҠ২ੑɺ࢖༻ੑͷ5ͭ • ࠓճ͸ͦΕΒ඼࣭ಛੑͷதͰ΋ҎԼ2ͭΛऔΓ্͛Δ(ͬ͘͟Γ) •

    ʮػೳੑɺ৴པੑɺҠ২ੑʯ → ʮίʔυͷಡΈ΍͢͞ʯ • ʮޮ཰ੑɺ࢖༻ੑʯ → ʮԠ౴଎౓ʯ • ʮಡΈ΍͢͞ʯͱʮԠ౴଎౓ʯΛߴΊΔࣄ͕ੑೳͷߴ͞ʹܨ͕Δ
  9. ʮಡΈ΍͢͞ʯΛߴΊΔ

  10. ʮಡΈ΍͢͞ʯΛߴΊΔ • PHP7ͷ৽͍͠ه๏͸ՄಡੑΛߴΊΔ • ྫʣ??ԋࢉࢠ • nullͰͳ͚Ε͹ͦͷ஋ΛɺnullͳΒӈΦϖϥϯυΛฦ͢ • ΋͏ isset()

    Ͱ͍͍ͪͪ֬ೝ͠ͳͯ͘ྑ͍ʂʂʂʂ
 
 
 
 
 
 
 // PHP <= 5.6 $name = isset($user["name"]) ? $user["name"] : "໊ແ͠"; // PHP7 $name = $user["name"] ?? "໊ແ͠";
  11. ʮಡΈ΍͢͞ʯΛߴΊΔ • ྫʣฦΓ஋ͷλΠϓώϯτɺεΧϥܕͷλΠϓώϯτΛαϙʔτ • ؔ਺ͷฦΓ஋ʹܕ͕ࢦఆͰ͖ΔΑ͏ʹͳͬͨ • ৽ͨʹint, float, string, bool

    ܕΛαϙʔτ
 
 
 
 
 
 
 
 <?php function hoge(int $base): array { $array = [1, 2, 3]; foreach ($array as $key => $num) { $array[$key] = $num * $base; } return $array; } hoge(3); // return [3, 6, 9] hoge("͍͋͏"); // PHP Fatal error: Uncaught TypeError: Argument 1 passed to hoge() must be of the type integer
  12. ʮಡΈ΍͢͞ʯΛߴΊΔ • ͦͷଞํ๏͸͜͜Ͱશͯڍ͛ΒΕͳ͍΄Ͳ
 ͨ͘͞Μ͋Δ • ͦͷதͰ΋ʮίʔσΟϯάن໿ʯ͸
 1ͭͷΞϓϩʔν • ʮίʔσΟϯάن໿ʯͱ͍͑͹…

  13. ʮಡΈ΍͢͞ʯΛߴΊΔ https://speakerdeck.com/fortkle/yasasiikodeingugui-yue-falsedao-ru

  14. ʮಡΈ΍͢͞ʯΛߴΊΔ • ʮ΍͍͞͠ίʔσΟϯάن໿ʯ • ͍͖ͳΓݫ͍͠ϧʔϧΛద༻͠ͳ͍ • ؇͍ϧʔϧΛಠࣗͰ࡞ΓঃʑʹPSR2ͳͲͷ
 ඪ४ʹ͍͍ۙͮͯ͘Ξϓϩʔν • εϥΠυͰ͋·Γ৮Εͳ͔ͬͨ෦෼

    • ʮͲ͏΍ͬͯίʔυΛमਖ਼͍ͯ͘͠ͷ͔ʁʯ
  15. ʮಡΈ΍͢͞ʯΛߴΊΔ • मਖ਼ΛਓͷखͰߦ͏ • ʮԿඦݸ΋εϖʔε΍Πϯσϯτͷमਖ਼Λͨ͘͠ͳ͍ʯ ʮϛε͕ൃੜ͢Δʯ • ग़དྷΔݶΓػցʹ΍ΒͤΔɺࣗಈԽ • phpcbf͕͓͢͢Ί

    • phpcsΛೖΕ͍ͯΔͳΒطʹΠϯετʔϧ͞Ε͍ͯΔ(!)
  16. ʮಡΈ΍͢͞ʯΛߴΊΔ • ίϚϯυ࣮ߦ΋phpcsͱ΄΅ಉ༷ɻ • ࣮ߦͯ͠git؅ཧ͢Ε͹मਖ਼׬ྃʂͱ͍͏खܰ͞
 
 
 
 
 


    // ࣗಈ੔ܗ $ vendor/bin/phpcbf --standard=./phpcs.xml ./app // มߋϑΝΠϧΛgit؅ཧ $ git st $ git add . $ git commit
  17. ʮಡΈ΍͢͞ʯΛߴΊΔ • ن໿Λ୭Ͱ΋ݟ͑Δॴʹஔ͍͓ͯ͘ͷ΋ॏཁ • ن໿ͷυΩϡϝϯτͱ࣮ࡍͷxmlΛ͋ΘͤΔ
 ɹྫʣCookpadɹɹɹɹɹ ྫʣConnehito

  18. ͜͜·Ͱͷࡶͳ·ͱΊ • PHP7ͷه๏͸ʮಡΈ΍͢͞ʯΛߴΊΔ • ίʔσΟϯάن໿Λ༻ҙ͢Δͷ΋1ͭͷख • ͨͩ͠΍ΔͳΒࣗಈ੔ܗ΋ඞਢ • ૣ͘PHP7ʹҠߦͯ͠଎͍PHPΛखʹೖ́ʢ

  19. ʮԠ౴଎౓ʯΛߴΊΔ

  20. ʮԠ౴଎౓ʯΛߴΊΔ • PHP7ʹ͢Δ͚ͩͰ͔ͳΓૣ͘ͳΔͬΆ͍ • TwitterͷTLɺPHP7ؔ࿈ͷهࣄɺࢲͷ࣮ମݧ(աڈࢿྉࢀর) • ਖ਼௚ɺҠߦͰେ͖ͳ໰୊͸΄ͱΜͲൃੜ͠ͳ͍(ߴ͍ޙํޓ׵ੑ) • ͔͠͠౰વPHP7ʹ͚ͨͩ͠Ͱ͸ղܾ͠ͳ͍
 ϘτϧωοΫ΋ͨ͘͞Μ͋Δ

    • ʮਪଌ͢ΔͳɺܭଌͤΑʯby ্࢘ UnixͷҒ͍ਓ

  21. ʮԠ౴଎౓ʯΛߴΊΔ • ܭଌ͢ΔʹϓϩϑΝΠϥʔͷ࢓ࣄ • PHPʹରԠ͍ͯ͠ΔϓϩϑΝΠϥʔ • ྫ) Xdebug, Xhprof, NewRelic,

    Blackfire.io • PHP7ʹରԠ͍ͯ͠ΔϓϩϑΝΠϥʔ(ॏཁ) • Xdebug ɾɾɾରԠࡁΈ • XhprofɾɾɾެࣜඇରԠʢFork൛ͰରԠࡁVer͋Γʣ • NewRelicɾɾɾ 2016೥3݄7೔ରԠVer ϦϦʔεʂ • Blackfire.ioɾɾɾ2016೥2݄2೔ରԠVer ϦϦʔεʂ
  22. ʮԠ౴଎౓ʯΛߴΊΔ Xdebug Xhprof http://blog.howtelevision.co.jp/entry/2014/11/14/192350 https://www.grafikart.fr/tutoriels/php/blackfire-631 http://newrelic.com/application-monitoring NewRelic Blackfire.io

  23. ʮԠ౴଎౓ʯΛߴΊΔ • ࠓճ͸XhprofΛ࢖ͬͨࣄྫΛखॱ΋߹Θͤͯ঺հ • ର৅ΞϓϦέʔγϣϯ͸CakePHP2Ͱ࡞੒͞Εͨ
 ؅ཧը໘ͷΑ͏ͳCRUD͕උΘͬͨҰൠతͳ΋ͷ • ಛʹҰཡϖʔδͷԠ౴଎౓ΛߴΊͯΈΔ • ಋೖ͸͍ͭ͘΋खॱ͕ॻ͔Εͨهࣄ͕͋ΔͷͰͦͪΒ


    PHP7ͰXHProfΛར༻͢Δํ๏ʢ࢑ఆ൛ʣ
 http://qiita.com/morisuke/items/49f17bda2c764ae8f725
  24. ʮԠ౴଎౓ʯΛߴΊΔ • هࣄҰཡදࣔը໘ͷϖʔδɻ
 هࣄσʔλΛDB͔Βऔಘͯ͠
 ੔ܗͯ͠ද͍ࣔͯ͠Δɻ • ࣮ߦ1ճ໨ɻԠ౴଎౓͸ 27.6ඵɻ • Ωϟογϡ΋Կ΋ͤͣߟ͑ͣʹ


    શͯͷσʔλ(1ສ݅ఔ౓)Λ
 1ϖʔδʹදࣔͯ͠ΈΔͱ͜Μͳײ͡ɻ
  25. ʮԠ౴଎౓ʯΛߴΊΔ • ॏ͍ͷ͸੺͘ͳ͍ͬͯΔ෦෼ɻ
 ͜͜Λॏ఺తʹݟ͍ͯ͘ɻ • ओʹCakeͷ഑ྻૢ࡞ͷ
 ศརΫϥε Hash͕ݪҼ • Hash::get()͸15ສճ


    Hash::extract()͸9ઍճ
 ίʔϧ͞Ε͍ͯΔ • ͜ͷճ਺ΛݮΒͤͳ͍͔ɺ
 ࣮ߦՕॴΛ֬ೝ
  26. ʮԠ౴଎౓ʯΛߴΊΔ • ࣮ߦ2ճ໨ɻԠ౴଎౓͸ 22.3ඵɻ
 5.3ඵͷ୹ॖɻ • ΍ͬͨ͜ͱ͸ɺ
 DB͔Βσʔλऔಘޙɺ഑ྻͷՃ޻Λ
 afterFind(ίʔϧόοΫϝιου)Ͱ
 ࣮ߦ͍͕ͯͨ͠ෆཁͳͷͰແޮԽɻ

  27. ʮԠ౴଎౓ʯΛߴΊΔ • Hash::get()ͷίʔϧ਺͕15ສճ͔Β
 12.8ສճ·Ͱ࡟ݮɻ • Hash::extract()ͷίʔϧ਺͕มΘͬͯ
 ͍ͳ͔ͬͨͷͰλʔήοτΛ
 Hash::extract()ʹઃఆɻෆཁͳॲཧ͕
 ͳ͍͔୳͢ɻ •

    ςϯϓϨʔτ(view)Ͱ Hash::extract()
 Λແବʹ࢖͍ͬͯΔ෦෼͕͋ͬͨͷͰ
 ผͷॲཧͰஔ͖׵͑ɻ
  28. ʮԠ౴଎౓ʯΛߴΊΔ • ࣮ߦ3ճ໨ɻԠ౴଎౓͸ 22.1ඵɻ
 0.2ඵͷ୹ॖɻ • ΍ͬͨ͜ͱ͸viewͰHash::extract()Λ
 ࢖Θͳ͍Α͏ʹ͢Δɻ

  29. ʮԠ౴଎౓ʯΛߴΊΔ • ॲཧ࣌ؒʹ͸͋·ΓӨڹ͕ͳ͔ͬͨ΋ͷͷ
 Hash::extract()ͷίʔϧ਺͕9ઍճ͔Β
 7ճʹܹݮʂ • ৽ͨʹHashΫϥε͕ϘτϧωοΫͱͯ͠
 ੺͘දࣔ͞ΕΔΑ͏ʹ
 → ෆ༻ҙʹHashΫϥεΛଟ༻͠ͳ͍Α͏


    ɹʹॻ͖׵͑Δɻ • ৽ͨʹHash::combine()Ϋϥε͕ոͦ͠͏
  30. ʮԠ౴଎౓ʯΛߴΊΔ • ࣮ߦ4ճ໨ɻԠ౴଎౓͸ 12.0ඵɻ
 10.1ඵͷ୹ॖʹ੒ޭʂ • ΍ͬͨ͜ͱ͸Hash::combine()Λ
 foreachʹஔ͖׵͑ɻ

  31. ʮԠ౴଎౓ʯΛߴΊΔ • Hash::combineΛ࢖Θͳ͘ͳͬͨ݁Ռ
 ؒ઀తʹHash::extract()΋࢖ΘΕͳ͘ͳΓ
 ੺͍ද͕ࣔফ͑Δʂ • ϘτϧωοΫ͕Hash::get()͚ͩʹɻ
 Hash::get()͕ͳͥଟ͘ͳ͍ͬͯΔͷ͔
 ௐ΂Δ •

    Configure::readͰઃఆ஋Λऔಘ͢Δ
 ॲཧ͕Hash::get()Λ͔ͳΓίʔϧ͍ͯ͠Δ
 ͷͰConfigure::readΛফͤͳ͍͔ݕ౼
  32. ʮԠ౴଎౓ʯΛߴΊΔ • ࣮ߦ5ճ໨ɻԠ౴଎౓͸ 8.7ඵɻ
 3.7ඵͷ୹ॖʹ੒ޭʂ • ΍ͬͨ͜ͱ͸ViewHelperΛܦ༝ͯ͠
 Configure::read()Λ࣮ߦ͍ͯͨ͠
 ෦෼ΛControllerଆʹ͖࣋ͬͯͯ
 ࢖͍ճ͢Α͏ʹ͢Δ

  33. ʮԠ౴଎౓ʯΛߴΊΔ • Configure::read()ͷίʔϧ਺͕
 11.3ສճ͔Β8.7ສճʹ࡟ݮʂ • ΋ͬͱݮΒͤͳ͍͔ɺෆཁͳ
 ViewHelperΛୟ͍͍ͯͳ͍͔
 ௐ΂Δɻ • UtilHelperͱ͍͏ͳΜͱ΋


    ศརͦ͏ͳϔϧύʔ͕
 Configure::read()Λ͔ͳΓ࣮ߦͯ͠
 ͍ͨͷͰλʔήοτʹઃఆ
  34. ʮԠ౴଎౓ʯΛߴΊΔ • ࣮ߦ6ճ໨ɻԠ౴଎౓͸ 5.9ඵɻ
 2.8ඵͷ୹ॖʹ੒ޭʂ • UtilHelper಺Ͱॏෳͯ͠ߦΘΕͯ
 ͍ͨॲཧΛControllerଆͰ·ͱΊͯ
 ࣮ߦ͠Viewଆʹ౉ͯ͋͛ͨ͠
 →

    View͔Βͷ Configure::read()ίʔϧ਺
 ɹ ͕ܹݮʂ
  35. ʮԠ౴଎౓ʯΛߴΊΔ • Configure::read()ͷίʔϧ਺͕
 8ສ͔݅Β2ສ݅ʹܹݮɻ
 ෭࣍తʹConfigure::read()͕ίʔϧ
 ͍ͯͨ͠Hash::get()ͷίʔϧ਺΋ݮΓ
 ੺͍ද͕ࣔന͘มΘΔ
 → ϘτϧωοΫ͕Ҡͬͨ •

    ࣍͸MysqlपΓ͕ϘτϧωοΫʹ..!
 
 ɹɹɹɹ……ɹ͜ͷ͋ͨΓͰҰ୴ऴྃɻ
  36. ʮԠ౴଎౓ʯΛߴΊΔ • ࠷ऴతʹɺ 27.6 ඵ͔͔͍ͬͯͨΞϓϦέʔγϣϯ͕
 5.9ඵ·Ͱૣ͘ͳͬͨʂʢ͔͠΋PHPͷվम͚ͩͰʂʣ • ΄ͱΜͲಛघͳࣄΛ۪ͤͣ௚ʹʮܭଌͯ͠վળˠܭଌͯ͠ɾɾɾʯΛ
 ܁Γฦ͢͜ͱͰίʔυ͸ྑ͘ͳ͍ͬͯ͘(͜ͷؒɺ1~2࣌ؒఔ౓)ɻ •

    ਪଌͤͣʹ࣮ࡍʹܭଌͯ͠ϘτϧωοΫΛ௵͢ͷ͕େࣄɻ
 ͜Ε͕PHP7ʹม͚͑ͨͩͰ͸ղܾ͠ͳ͍໰୊ɻఆظతʹৼΓฦΔͷॏཁɻ • ͨͩɺ͕͢͞ʹ5.9ඵͰ΋ॏ͍ͷͰͦͷޙઃܭ͔Βݟͳ͓ͯ͠
 1ඵҎԼʹվળͨ͠ɻ
  37. ·ͱΊ • ૣ͘PHP7ʹҠߦͯ͠଎͍PHPΛखʹೖ́ʢ • ҠߦͰো֐ʹͳΓͦ͏ͳՕॴ͸΄ͱΜͲͳ͍ɻͦΕ͙Β͍ߴ͍ ޙํޓ׵ੑ͕͋Δ • ໰୊͕͋Δͱͨ͠ΒϞδϡʔϧɺ֦ுͳͷͰͦ͜͸࠷৽৘ใʹ ΩϟονΞοϓ͓ͯ͘͠ •

    PHP7͚ͩͰ͸(PHPͷվળ͚ͩͰ͸)ɺຊ౰ͷʮ଎͞ʯ͸
 खʹೖΒͳ͍ͷͰʮಡΈ΍͘͢ʯʮԠ౴଎౓͕଎͍ʯίʔυΛ
 อͭΑ͏ʹ͠Α͏
  38. ͓͠·͍