Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ハイパフォーマンスPHPアプリケーション(への道)
Search
fortkle
April 14, 2016
Technology
2
1.6k
ハイパフォーマンスPHPアプリケーション(への道)
ハイパフォーマンスを目指すにあたって誰もが知っておきたい基本的なところをまとめました。
fortkle
April 14, 2016
Tweet
Share
More Decks by fortkle
See All by fortkle
無駄な物をなるべく作らないリプレイス戦略 / replace-strategy-phperkaigi2021
fortkle
1
2.1k
フルリモート時代のカンバン運用 / kanban-operation-in-remote
fortkle
0
620
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020
fortkle
3
4.1k
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
6.8k
「設計振り返り」を始めてみようと思っている話 / architecture reflection
fortkle
3
530
「ママ向けNo.1アプリ」の 更なる成長を支える仕組み / startup-engineer-night-connehito
fortkle
2
280
良いテストデータ、悪いテストデータ / testdata-antipattern
fortkle
4
6.7k
BackstopJSで始める CSSリグレッションテスト / backstopjs-css-test
fortkle
0
1.5k
PhpStorm導入アンチパターン / phpstorm-anti-pattern
fortkle
0
2k
Other Decks in Technology
See All in Technology
分布で見る効果検証入門 / ai-distributional-effect
cyberagentdevelopers
PRO
4
700
Amazon_CloudWatch_ログ異常検出_導入ガイド
tsujiba
4
1.6k
大規模データ基盤チームのオンプレTiDB運用への挑戦 / dpu-tidb
cyberagentdevelopers
PRO
1
110
CAMERA-Suite: 広告文生成のための評価スイート / ai-camera-suite
cyberagentdevelopers
PRO
3
270
AWSコンテナ本出版から3年経った今、もし改めて執筆し直すなら / If I revise our container book
iselegant
15
4k
MAMを軸とした動画ハンドリングにおけるAI活用前提の整備と次世代ビジョン / abema-ai-mam
cyberagentdevelopers
PRO
1
110
신뢰할 수 있는 AI 검색 엔진을 만들기 위한 Liner의 여정
huffon
0
340
来年もre:Invent2024 に行きたいあなたへ - “集中”と“つながり”で楽しむ -
ny7760
0
470
プロダクトエンジニアが活躍する環境を作りたくて 事業責任者になった話 ~プロダクトエンジニアの行き着く先~
gimupop
1
480
pandasはPolarsに性能面で追いつき追い越せるのか
vaaaaanquish
4
4.6k
わたしとトラックポイント / TrackPoint tips
masahirokawahara
1
240
現地でMeet Upをやる場合の注意点〜反省点を添えて〜
shotashiratori
0
520
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
Faster Mobile Websites
deanohume
304
30k
Building Adaptive Systems
keathley
38
2.2k
Agile that works and the tools we love
rasmusluckow
327
21k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
7
150
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
32
1.8k
Building an army of robots
kneath
302
42k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
355
29k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
43
6.6k
Transcript
ϋΠύϑΥʔϚϯε PHPΞϓϦέʔγϣϯ(ͷಓ) ߴ ߊ @fortkle - PHP7 Casual Talks #2
ࣗݾհ • @fortkle • ੜਮͷPHPer • ݩʑLaravelਪ͠ͷݱࡏCakePHPer • ۙگɿ͜͜1िؒɺίʔσΟϯάதͣͬͱ ɹɹɹᓏࡔ46ͷʮαΠϨϯτϚδϣϦςΟʔʯͷϧʔϓ
• Connehito גࣜձࣾͰΤϯδχΞ
ϝσΟΞ ϢʔβʔࢀՃܕΞϓϦ mamari jp mamari Q ϚϚͷ 3ਓʹ1ਓ ͕ར༻ʂ
ࢀরɿGoogle Analytics ݄ؒར༻ऀ 400ສਓ Ҏ্ ʮਓͷੜ׆ʹͳͯ͘ͳΒͳ͍ʯαʔϏεΛΔ
“ύϑΥʔϚϯε”
ύϑΥʔϚϯεϏδωεʹ Өڹ͢Δ • 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
ύϑΥʔϚϯε = Ԡ?
ύϑΥʔϚϯεͱԿ͔ʁ • ϋΠύϑΥʔϚϯε = ʮظҎ্ͷੑೳΛ্ ͍͛ͯΔ͜ͱʯ • ύϑΥʔϚϯεʮԠʯ͚ͩͰͳ͍ • ʮੑೳʯཁ݅ఆٛ͠ʹ͍͘
• ϏδωεʹӨڹ͢Δͷʹܰࢹ͞Ε͕ͪ
ੑೳΛ͋ΘΒ͢ʮ࣭ಛੑʯ • ʮੑೳʯཁ݅ఆٛ͠ʹ͍͘ • ιϑτΣΞςετͷੈքʹʮ࣭ಛੑʯͱ͍͏ج४͕͋Δ • ػೳੑɺ৴པੑɺޮੑɺҠ২ੑɺ༻ੑͷ5ͭ • ࠓճͦΕΒ࣭ಛੑͷதͰҎԼ2ͭΛऔΓ্͛Δ(ͬ͘͟Γ) •
ʮػೳੑɺ৴པੑɺҠ২ੑʯ → ʮίʔυͷಡΈ͢͞ʯ • ʮޮੑɺ༻ੑʯ → ʮԠʯ • ʮಡΈ͢͞ʯͱʮԠʯΛߴΊΔࣄ͕ੑೳͷߴ͞ʹܨ͕Δ
ʮಡΈ͢͞ʯΛߴΊΔ
ʮಡΈ͢͞ʯΛߴΊΔ • PHP7ͷ৽͍͠ه๏ՄಡੑΛߴΊΔ • ྫʣ??ԋࢉࢠ • nullͰͳ͚ΕͦͷΛɺnullͳΒӈΦϖϥϯυΛฦ͢ • ͏ isset()
Ͱ͍͍ͪͪ֬ೝ͠ͳͯ͘ྑ͍ʂʂʂʂ // PHP <= 5.6 $name = isset($user["name"]) ? $user["name"] : "໊ແ͠"; // PHP7 $name = $user["name"] ?? "໊ແ͠";
ʮಡΈ͢͞ʯΛߴΊΔ • ྫʣฦΓͷλΠϓώϯτɺεΧϥܕͷλΠϓώϯτΛαϙʔτ • ؔͷฦΓʹܕ͕ࢦఆͰ͖ΔΑ͏ʹͳͬͨ • ৽ͨʹ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
ʮಡΈ͢͞ʯΛߴΊΔ • ͦͷଞํ๏͜͜Ͱશͯڍ͛ΒΕͳ͍΄Ͳ ͨ͘͞Μ͋Δ • ͦͷதͰʮίʔσΟϯάنʯ 1ͭͷΞϓϩʔν • ʮίʔσΟϯάنʯͱ͍͑…
ʮಡΈ͢͞ʯΛߴΊΔ https://speakerdeck.com/fortkle/yasasiikodeingugui-yue-falsedao-ru
ʮಡΈ͢͞ʯΛߴΊΔ • ʮ͍͞͠ίʔσΟϯάنʯ • ͍͖ͳΓݫ͍͠ϧʔϧΛద༻͠ͳ͍ • ؇͍ϧʔϧΛಠࣗͰ࡞ΓঃʑʹPSR2ͳͲͷ ඪ४ʹ͍͍ۙͮͯ͘Ξϓϩʔν • εϥΠυͰ͋·Γ৮Εͳ͔ͬͨ෦
• ʮͲ͏ͬͯίʔυΛमਖ਼͍ͯ͘͠ͷ͔ʁʯ
ʮಡΈ͢͞ʯΛߴΊΔ • मਖ਼ΛਓͷखͰߦ͏ • ʮԿඦݸεϖʔεΠϯσϯτͷमਖ਼Λͨ͘͠ͳ͍ʯ ʮϛε͕ൃੜ͢Δʯ • ग़དྷΔݶΓػցʹΒͤΔɺࣗಈԽ • phpcbf͕͓͢͢Ί
• phpcsΛೖΕ͍ͯΔͳΒطʹΠϯετʔϧ͞Ε͍ͯΔ(!)
ʮಡΈ͢͞ʯΛߴΊΔ • ίϚϯυ࣮ߦphpcsͱ΄΅ಉ༷ɻ • ࣮ߦͯ͠gitཧ͢Εमਖ਼ྃʂͱ͍͏खܰ͞
// ࣗಈܗ $ vendor/bin/phpcbf --standard=./phpcs.xml ./app // มߋϑΝΠϧΛgitཧ $ git st $ git add . $ git commit
ʮಡΈ͢͞ʯΛߴΊΔ • نΛ୭Ͱݟ͑Δॴʹஔ͍͓ͯ͘ͷॏཁ • نͷυΩϡϝϯτͱ࣮ࡍͷxmlΛ͋ΘͤΔ ɹྫʣCookpadɹɹɹɹɹ ྫʣConnehito
͜͜·Ͱͷࡶͳ·ͱΊ • PHP7ͷه๏ʮಡΈ͢͞ʯΛߴΊΔ • ίʔσΟϯάنΛ༻ҙ͢Δͷ1ͭͷख • ͨͩ͠ΔͳΒࣗಈܗඞਢ • ૣ͘PHP7ʹҠߦ͍ͯ͠PHPΛखʹೖ́ʢ
ʮԠʯΛߴΊΔ
ʮԠʯΛߴΊΔ • PHP7ʹ͢Δ͚ͩͰ͔ͳΓૣ͘ͳΔͬΆ͍ • TwitterͷTLɺPHP7ؔ࿈ͷهࣄɺࢲͷ࣮ମݧ(աڈࢿྉࢀর) • ਖ਼ɺҠߦͰେ͖ͳ΄ͱΜͲൃੜ͠ͳ͍(ߴ͍ޙํޓੑ) • ͔͠͠વPHP7ʹ͚ͨͩ͠Ͱղܾ͠ͳ͍ ϘτϧωοΫͨ͘͞Μ͋Δ
• ʮਪଌ͢ΔͳɺܭଌͤΑʯby ্࢘ UnixͷҒ͍ਓ
ʮԠʯΛߴΊΔ • ܭଌ͢ΔʹϓϩϑΝΠϥʔͷࣄ • PHPʹରԠ͍ͯ͠ΔϓϩϑΝΠϥʔ • ྫ) Xdebug, Xhprof, NewRelic,
Blackfire.io • PHP7ʹରԠ͍ͯ͠ΔϓϩϑΝΠϥʔ(ॏཁ) • Xdebug ɾɾɾରԠࡁΈ • XhprofɾɾɾެࣜඇରԠʢFork൛ͰରԠࡁVer͋Γʣ • NewRelicɾɾɾ 20163݄7ରԠVer ϦϦʔεʂ • Blackfire.ioɾɾɾ20162݄2ରԠVer ϦϦʔεʂ
ʮԠʯΛߴΊΔ 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
ʮԠʯΛߴΊΔ • ࠓճXhprofΛͬͨࣄྫΛखॱ߹Θͤͯհ • ରΞϓϦέʔγϣϯCakePHP2Ͱ࡞͞Εͨ ཧը໘ͷΑ͏ͳCRUD͕උΘͬͨҰൠతͳͷ • ಛʹҰཡϖʔδͷԠΛߴΊͯΈΔ • ಋೖ͍ͭ͘खॱ͕ॻ͔Εͨهࣄ͕͋ΔͷͰͦͪΒ
PHP7ͰXHProfΛར༻͢Δํ๏ʢఆ൛ʣ http://qiita.com/morisuke/items/49f17bda2c764ae8f725
ʮԠʯΛߴΊΔ • هࣄҰཡදࣔը໘ͷϖʔδɻ هࣄσʔλΛDB͔Βऔಘͯ͠ ܗͯ͠ද͍ࣔͯ͠Δɻ • ࣮ߦ1ճɻԠ 27.6ඵɻ • ΩϟογϡԿͤͣߟ͑ͣʹ
શͯͷσʔλ(1ສ݅ఔ)Λ 1ϖʔδʹදࣔͯ͠ΈΔͱ͜Μͳײ͡ɻ
ʮԠʯΛߴΊΔ • ॏ͍ͷ͘ͳ͍ͬͯΔ෦ɻ ͜͜Λॏతʹݟ͍ͯ͘ɻ • ओʹCakeͷྻૢ࡞ͷ ศརΫϥε Hash͕ݪҼ • Hash::get()15ສճ
Hash::extract()9ઍճ ίʔϧ͞Ε͍ͯΔ • ͜ͷճΛݮΒͤͳ͍͔ɺ ࣮ߦՕॴΛ֬ೝ
ʮԠʯΛߴΊΔ • ࣮ߦ2ճɻԠ 22.3ඵɻ 5.3ඵͷॖɻ • ͬͨ͜ͱɺ DB͔ΒσʔλऔಘޙɺྻͷՃΛ afterFind(ίʔϧόοΫϝιου)Ͱ ࣮ߦ͍͕ͯͨ͠ෆཁͳͷͰແޮԽɻ
ʮԠʯΛߴΊΔ • Hash::get()ͷίʔϧ͕15ສճ͔Β 12.8ສճ·Ͱݮɻ • Hash::extract()ͷίʔϧ͕มΘͬͯ ͍ͳ͔ͬͨͷͰλʔήοτΛ Hash::extract()ʹઃఆɻෆཁͳॲཧ͕ ͳ͍͔୳͢ɻ •
ςϯϓϨʔτ(view)Ͱ Hash::extract() Λແବʹ͍ͬͯΔ෦͕͋ͬͨͷͰ ผͷॲཧͰஔ͖͑ɻ
ʮԠʯΛߴΊΔ • ࣮ߦ3ճɻԠ 22.1ඵɻ 0.2ඵͷॖɻ • ͬͨ͜ͱviewͰHash::extract()Λ Θͳ͍Α͏ʹ͢Δɻ
ʮԠʯΛߴΊΔ • ॲཧ࣌ؒʹ͋·ΓӨڹ͕ͳ͔ͬͨͷͷ Hash::extract()ͷίʔϧ͕9ઍճ͔Β 7ճʹܹݮʂ • ৽ͨʹHashΫϥε͕ϘτϧωοΫͱͯ͠ ͘දࣔ͞ΕΔΑ͏ʹ → ෆ༻ҙʹHashΫϥεΛଟ༻͠ͳ͍Α͏
ɹʹॻ͖͑Δɻ • ৽ͨʹHash::combine()Ϋϥε͕ոͦ͠͏
ʮԠʯΛߴΊΔ • ࣮ߦ4ճɻԠ 12.0ඵɻ 10.1ඵͷॖʹޭʂ • ͬͨ͜ͱHash::combine()Λ foreachʹஔ͖͑ɻ
ʮԠʯΛߴΊΔ • Hash::combineΛΘͳ͘ͳͬͨ݁Ռ ؒతʹHash::extract()ΘΕͳ͘ͳΓ ͍ද͕ࣔফ͑Δʂ • ϘτϧωοΫ͕Hash::get()͚ͩʹɻ Hash::get()͕ͳͥଟ͘ͳ͍ͬͯΔͷ͔ ௐΔ •
Configure::readͰઃఆΛऔಘ͢Δ ॲཧ͕Hash::get()Λ͔ͳΓίʔϧ͍ͯ͠Δ ͷͰConfigure::readΛফͤͳ͍͔ݕ౼
ʮԠʯΛߴΊΔ • ࣮ߦ5ճɻԠ 8.7ඵɻ 3.7ඵͷॖʹޭʂ • ͬͨ͜ͱViewHelperΛܦ༝ͯ͠ Configure::read()Λ࣮ߦ͍ͯͨ͠ ෦ΛControllerଆʹ͖࣋ͬͯͯ ͍ճ͢Α͏ʹ͢Δ
ʮԠʯΛߴΊΔ • Configure::read()ͷίʔϧ͕ 11.3ສճ͔Β8.7ສճʹݮʂ • ͬͱݮΒͤͳ͍͔ɺෆཁͳ ViewHelperΛୟ͍͍ͯͳ͍͔ ௐΔɻ • UtilHelperͱ͍͏ͳΜͱ
ศརͦ͏ͳϔϧύʔ͕ Configure::read()Λ͔ͳΓ࣮ߦͯ͠ ͍ͨͷͰλʔήοτʹઃఆ
ʮԠʯΛߴΊΔ • ࣮ߦ6ճɻԠ 5.9ඵɻ 2.8ඵͷॖʹޭʂ • UtilHelperͰॏෳͯ͠ߦΘΕͯ ͍ͨॲཧΛControllerଆͰ·ͱΊͯ ࣮ߦ͠Viewଆʹͯ͋͛ͨ͠ →
View͔Βͷ Configure::read()ίʔϧ ɹ ͕ܹݮʂ
ʮԠʯΛߴΊΔ • Configure::read()ͷίʔϧ͕ 8ສ͔݅Β2ສ݅ʹܹݮɻ ෭࣍తʹConfigure::read()͕ίʔϧ ͍ͯͨ͠Hash::get()ͷίʔϧݮΓ ͍ද͕ࣔന͘มΘΔ → ϘτϧωοΫ͕Ҡͬͨ •
࣍MysqlपΓ͕ϘτϧωοΫʹ..! ɹɹɹɹ……ɹ͜ͷ͋ͨΓͰҰ୴ऴྃɻ
ʮԠʯΛߴΊΔ • ࠷ऴతʹɺ 27.6 ඵ͔͔͍ͬͯͨΞϓϦέʔγϣϯ͕ 5.9ඵ·Ͱૣ͘ͳͬͨʂʢ͔͠PHPͷվम͚ͩͰʂʣ • ΄ͱΜͲಛघͳࣄΛ۪ͤͣʹʮܭଌͯ͠վળˠܭଌͯ͠ɾɾɾʯΛ ܁Γฦ͢͜ͱͰίʔυྑ͘ͳ͍ͬͯ͘(͜ͷؒɺ1~2࣌ؒఔ)ɻ •
ਪଌͤͣʹ࣮ࡍʹܭଌͯ͠ϘτϧωοΫΛ௵͢ͷ͕େࣄɻ ͜Ε͕PHP7ʹม͚͑ͨͩͰղܾ͠ͳ͍ɻఆظతʹৼΓฦΔͷॏཁɻ • ͨͩɺ͕͢͞ʹ5.9ඵͰॏ͍ͷͰͦͷޙઃܭ͔Βݟͳ͓ͯ͠ 1ඵҎԼʹվળͨ͠ɻ
·ͱΊ • ૣ͘PHP7ʹҠߦ͍ͯ͠PHPΛखʹೖ́ʢ • ҠߦͰোʹͳΓͦ͏ͳՕॴ΄ͱΜͲͳ͍ɻͦΕ͙Β͍ߴ͍ ޙํޓੑ͕͋Δ • ͕͋Δͱͨ͠ΒϞδϡʔϧɺ֦ுͳͷͰͦ͜࠷৽ใʹ ΩϟονΞοϓ͓ͯ͘͠ •
PHP7͚ͩͰ(PHPͷվળ͚ͩͰ)ɺຊͷʮ͞ʯ खʹೖΒͳ͍ͷͰʮಡΈ͘͢ʯʮԠ͕͍ʯίʔυΛ อͭΑ͏ʹ͠Α͏
͓͠·͍