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.3k
フルリモート時代のカンバン運用 / kanban-operation-in-remote
fortkle
0
680
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020
fortkle
3
4.4k
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
7.2k
「設計振り返り」を始めてみようと思っている話 / architecture reflection
fortkle
3
560
「ママ向けNo.1アプリ」の 更なる成長を支える仕組み / startup-engineer-night-connehito
fortkle
2
310
良いテストデータ、悪いテストデータ / testdata-antipattern
fortkle
4
6.8k
BackstopJSで始める CSSリグレッションテスト / backstopjs-css-test
fortkle
0
1.5k
PhpStorm導入アンチパターン / phpstorm-anti-pattern
fortkle
0
2.1k
Other Decks in Technology
See All in Technology
登壇ネタの見つけ方 / How to find talk topics
pinkumohikan
1
140
(非公式) AWS Summit Japan と 海浜幕張 の歩き方 2025年版
coosuke
PRO
1
320
Абьюзим random_bytes(). Фёдор Кулаков, разработчик Lamoda Tech
lamodatech
0
260
Perk アプリの技術選定とリリースから1年弱経ってのふりかえり
stomk
0
120
Observability infrastructure behind the trillion-messages scale Kafka platform
lycorptech_jp
PRO
0
130
Clineを含めたAIエージェントを 大規模組織に導入し、投資対効果を考える / Introducing AI agents into your organization
i35_267
4
1.3k
菸酒生在 LINE Taiwan 的後端雙刀流
line_developers_tw
PRO
0
1.1k
AWS Summit Japan 2025 Community Stage - App workflow automation by AWS Step Functions
matsuihidetoshi
1
140
生成AIでwebアプリケーションを作ってみた
tajimon
2
120
AIのAIによるAIのための出力評価と改善
chocoyama
0
460
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
180
BigQuery Remote FunctionでLooker Studioをインタラクティブ化
cuebic9bic
2
210
Featured
See All Featured
Docker and Python
trallard
44
3.4k
GitHub's CSS Performance
jonrohan
1031
460k
Speed Design
sergeychernyshev
31
1k
Bash Introduction
62gerente
614
210k
Making the Leap to Tech Lead
cromwellryan
134
9.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
Agile that works and the tools we love
rasmusluckow
329
21k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
We Have a Design System, Now What?
morganepeng
52
7.6k
Faster Mobile Websites
deanohume
307
31k
Building a Modern Day E-commerce SEO Strategy
aleyda
41
7.3k
Facilitating Awesome Meetings
lara
54
6.4k
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ͷվળ͚ͩͰ)ɺຊͷʮ͞ʯ खʹೖΒͳ͍ͷͰʮಡΈ͘͢ʯʮԠ͕͍ʯίʔυΛ อͭΑ͏ʹ͠Α͏
͓͠·͍