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
ハノーバーメッセ2025座談会.pdf
iotcomjpadmin
0
150
A2Aのクライアントを自作する
rynsuke
1
150
CI/CDとタスク共有で加速するVibe Coding
tnbe21
0
230
Microsoft Build 2025 技術/製品動向 for Microsoft Startup Tech Community
torumakabe
1
200
Amazon ECS & AWS Fargate 運用アーキテクチャ2025 / Amazon ECS and AWS Fargate Ops Architecture 2025
iselegant
15
4.5k
UIテスト自動化サポート- Testbed for XCUIAutomation practice
notoroid
0
110
AWS CDK 実践的アプローチ N選 / aws-cdk-practical-approaches
gotok365
4
490
ユーザーのプロフィールデータを活用した推薦精度向上の取り組み
yudai00
0
490
VISITS_AIIoTビジネス共創ラボ登壇資料.pdf
iotcomjpadmin
0
150
PHPでWebブラウザのレンダリングエンジンを実装する
dip_tech
PRO
0
150
Azure AI Foundryでマルチエージェントワークフロー
seosoft
0
150
白金鉱業Meetup_Vol.19_PoCはデモで語れ!顧客の本音とインサイトを引き出すソリューション構築
brainpadpr
2
490
Featured
See All Featured
Gamification - CAS2011
davidbonilla
81
5.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Into the Great Unknown - MozCon
thekraken
39
1.9k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
4
200
We Have a Design System, Now What?
morganepeng
52
7.6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
The Language of Interfaces
destraynor
158
25k
How to train your dragon (web standard)
notwaldorf
92
6.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
41
7.3k
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ͷվળ͚ͩͰ)ɺຊͷʮ͞ʯ खʹೖΒͳ͍ͷͰʮಡΈ͘͢ʯʮԠ͕͍ʯίʔυΛ อͭΑ͏ʹ͠Α͏
͓͠·͍