Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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.4k
フルリモート時代のカンバン運用 / kanban-operation-in-remote
fortkle
0
710
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020
fortkle
3
4.6k
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
7.3k
「設計振り返り」を始めてみようと思っている話 / architecture reflection
fortkle
3
580
「ママ向けNo.1アプリ」の 更なる成長を支える仕組み / startup-engineer-night-connehito
fortkle
2
320
良いテストデータ、悪いテストデータ / testdata-antipattern
fortkle
4
6.9k
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
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
470
OCI Oracle Database Services新機能アップデート(2025/09-2025/11)
oracle4engineer
PRO
1
130
5分で知るMicrosoft Ignite
taiponrock
PRO
0
340
Playwright x GitHub Actionsで実現する「レビューしやすい」E2Eテストレポート
kinosuke01
0
580
AWS Bedrock AgentCoreで作る 1on1支援AIエージェント 〜Memory × Evaluationsによる実践開発〜
yusukeshimizu
6
400
第4回 「メタデータ通り」 リアル開催
datayokocho
0
130
エンジニアリングマネージャー はじめての目標設定と評価
halkt
0
280
Gemini でコードレビュー知見を見える化
zozotech
PRO
1
250
EM歴1年10ヶ月のぼくがぶち当たった苦悩とこれからへ向けて
maaaato
0
270
年間40件以上の登壇を続けて見えた「本当の発信力」/ 20251213 Masaki Okuda
shift_evolve
PRO
1
120
Edge AI Performance on Zephyr Pico vs. Pico 2
iotengineer22
0
140
エンジニアとPMのドメイン知識の溝をなくす、 AIネイティブな開発プロセス
applism118
4
1.2k
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
How GitHub (no longer) Works
holman
316
140k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Code Review Best Practice
trishagee
74
19k
Site-Speed That Sticks
csswizardry
13
1k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
The Invisible Side of Design
smashingmag
302
51k
Building Flexible Design Systems
yeseniaperezcruz
330
39k
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ͷվળ͚ͩͰ)ɺຊͷʮ͞ʯ खʹೖΒͳ͍ͷͰʮಡΈ͘͢ʯʮԠ͕͍ʯίʔυΛ อͭΑ͏ʹ͠Α͏
͓͠·͍