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
モバイル界のMCPを考える
naoto33
0
350
CursorによるPMO業務の代替 / Automating PMO Tasks with Cursor
motoyoshi_kakaku
2
770
20250625 Snowflake Summit 2025活用事例 レポート / Nowcast Snowflake Summit 2025 Case Study Report
kkuv
1
370
解析の定理証明実践@Lean 4
dec9ue
1
200
変化する開発、進化する体系時代に適応するソフトウェアエンジニアの知識と考え方(JaSST'25 Kansai)
mizunori
1
260
「良さそう」と「とても良い」の間には 「良さそうだがホンマか」がたくさんある / 2025.07.01 LLM品質Night
smiyawaki0820
1
430
2025-06-26 GitHub CopilotとAI駆動開発:実践と導入のリアル
fl_kawachi
1
230
CI/CD/IaC 久々に0から環境を作ったらこうなりました
kaz29
1
200
Model Mondays S2E03: SLMs & Reasoning
nitya
0
230
生成AI時代 文字コードを学ぶ意義を見出せるか?
hrsued
1
730
Fabric + Databricks 2025.6 の最新情報ピックアップ
ryomaru0825
1
160
Delegating the chores of authenticating users to Keycloak
ahus1
0
130
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Building an army of robots
kneath
306
45k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Fireside Chat
paigeccino
37
3.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Testing 201, or: Great Expectations
jmmastey
42
7.6k
The Straight Up "How To Draw Better" Workshop
denniskardys
234
140k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
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ͷվળ͚ͩͰ)ɺຊͷʮ͞ʯ खʹೖΒͳ͍ͷͰʮಡΈ͘͢ʯʮԠ͕͍ʯίʔυΛ อͭΑ͏ʹ͠Α͏
͓͠·͍