Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜

「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜

PHPerKaigi 2026

2026-03-21 10:40 -
Track B / レギュラートーク(40分)

プロポーザル: https://fortee.jp/phperkaigi-2026/proposal/a16d700c-23b2-4345-956c-eb7869daa814

Avatar for 武田 憲太郎

武田 憲太郎

March 21, 2026
Tweet

More Decks by 武田 憲太郎

Other Decks in Programming

Transcript

  1. Cloud Infrastructure Server User CDN LB Web Server App Runtime

    DB Cache Ext API ͢΂ͯͷϦΫΤετ͸ɺ ඞͣ͜ΕΒͷlઢzΛ௨Δ
  2.  ʮ઀ଓʯͷجຊ֓೦ͱ)551  ΞϓϦέʔγϣϯ΁ͷʮ઀ଓʯ  σʔλϕʔε΁ͷʮ઀ଓʯ  Ωϟογϡ΁ͷʮ઀ଓʯ  ֎෦"1*΁ͷʮ઀ଓʯ

     ઀ଓ͸ੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 10
  3. 1 2 3 4 5 index.htm フレームセット 1 menu.htm ナビゲーション

    2 top.htm コンテンツ 3 abehiroshi.jpg 背景画像 4 abe-top-*.jpg プロフィール写真 5 ʮѨ෦׮ͷϗʔϜϖʔδʯ͕දࣔ͞ΕΔ·Ͱ
  4.  5$1઀ଓཱ֬ʢXBZIBOETIBLFʣ • EBZ5SBDL" 1)1ͰͰ͖Δʂࣗ࡞*1ϧʔλʔ CZࢢ઒!DBLFQIQFS  5-4ϋϯυγΣΠΫʢ)5514ͷ৔߹ʣ • EBZ5SBDL#

    1)1Ͱ5-4ͷϓϩτίϧΛ࣮૷ͯ͠ΈΔ CZͻ͕͖  ϦΫΤετɾϨεϙϯε • %BZ5SBDL# ंྠͷ࠶ൃ໌Λ͠Α͏ʂ1)1Ͱ࣮૷ֶͯ͠Ϳɺ8FCαʔόʔͷ࢓૊Έͱ)551ͷਖ਼ମ CZ)3 ʮ઀ଓʯຖʹҰఆͷίετ͕ൃੜ͍ͯ͠Δ ʮ઀ଓʯΛߏ੒͢Δཁૉ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 13
  5. ໾ׂΛऴ͑ͨ઀ଓΛผͷϦΫΤετʹ࠶ར༻ • "QBDIF • ,FFQ"MJWF0O • σϑΥϧτ༗ޮʢ௨ৗ͸Կ΋͠ͳͯ͘ྑ͍ʣ • ݹ͍࣌୅ͷઃఆϑΝΠϧ͸0GG͕ଟ͍ͷͰ஫ҙ •

    /HJOY • ৗʹ༗ޮ )551,FFQ"MJWFr઀ଓͷ࠶ར༻ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 14
  6. 1 2 3 4 5 index.htm フレームセット 1 menu.htm ナビゲーション

    2 top.htm コンテンツ 3 abehiroshi.jpg 背景画像 4 abe-top-*.jpg プロフィール写真 5 再利用 再利用 再利用 段階1 段階2 ─ 並列 段階3 ─ 並列 ઀ଓͷଟॏԽͱ࠶ར༻ʹΑΔੑೳ޲্
  7. 6 7 ϖʔδભҠΛލ͙઀ଓͷ࠶ར༻ トップページ 映画出演 index.htm フレームセット 1 menu.htm ナビゲーション

    2 top.htm コンテンツ 3 abehiroshi.jpg 背景画像 4 abe-top-*.jpg プロフィール写真 5 eiga.htm 映画出演ページ 6 movie.jpg 映画画像 7 再利用したい 再利用したい
  8. ϒϥ΢βଆ • ۭ͍͍ͯΔ઀ଓ͸ՄೳͳݶΓ࠶ར༻͢Δ • ϖʔδભҠΛލ͍Ͱ΋࠶ར༻͢Δ αʔόଆ • ࠶ར༻ͷ༗ޮظݶΛઃఆՄೳ • "QBDIF,FFQ"MJWF5JNFPVUʢඵɾσϑΥϧτʣ

    • OHJOYLFFQBMJWF@UJNFPVUTʢσϑΥϧτʣ ઀ଓ͕࠶ར༻͞ΕΔ৚݅ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 18
  9. લఏ • 17NJOº઀ଓ • ཭୤཰ ʢλϒ͸ด͡ͳ͍ʣ ,FFQ"MJWF5JNFPVUͱಉ࣌઀ଓͷރׇ KeepAliveTimeout 離脱ユーザーのアイドル接続 60秒

    50人 × 6接続 = 300 5秒 約4人 ×6接続 = 24 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 21 KeepAliveTimeoutを十分に長くすると MaxRequestWorkers 256 を離脱ユーザーだけで超過
  10. ࣋ଓ઀ଓʹٻΊΔཁ݅ • ϒϥ΢β • ͋ΒΏΔঢ়گͰ࠶ར༻Ͱ͖ΔΑ͏௕͘ҡ࣋ͯ͠ཉ͍͠ • αʔό • ඞཁͳ઀ଓ͸ҡ͍͕࣋ͨ͠ෆཁͳ઀ଓ͸଎΍͔ʹ੾Γ͍ͨ ,FFQ"MJWF5JNFPVUͷτϨʔυΦϑ

    十分に大きな値 適度に小さな値 接続の再利用 ✅高確率で再利用 ❌同一ページ内に限定 同時接続数 ❌離脱ユーザーも消費 ✅ページロード中に限定 リソース消費 ❌メモリ圧迫・制限到達リスク ✅抑制される 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 22
  11. $%/ϩʔυόϥϯαʹΑΔղܾ 直接接続 ブラウザ N = ?(予測困難) Webサーバ ෆಛఆଟ਺ͷ઀ଓ ʢ༧ଌࠔ೉ʣ Proxy経由

    ブラウザ N = ?(予測困難) Proxyサーバ 設定管理された接続 (予測可能) Webサーバ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 23 Webサーバへの接続を ブラウザを跨いで再利用
  12.  ʮ઀ଓʯͷجຊ֓೦ͱ)551  ΞϓϦέʔγϣϯ΁ͷʮ઀ଓʯ  σʔλϕʔε΁ͷʮ઀ଓʯ  Ωϟογϡ΁ͷʮ઀ଓʯ  ֎෦"1*΁ͷʮ઀ଓʯ

     ઀ଓ͸ੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 26
  13. $%/-#ͱ8FCαʔόͷؔ܎ʹࣅ͍ͯΔ • OHJOY͕શͯͷ઀ଓΛड͚෇͚ • ඞཁͳ͚࣌ͩQIQGQN΁தܧ • ઀ଓ͸ϦΫΤετΛލ͍Ͱ࠶ར༻ ͜ΕʹΑΓ • ϒϥ΢β͔Βݟͨ઀ଓ਺

    ΞϓϦ͔Βݟͨ઀ଓ਺ ͱ͍͏ߏ੒͕Մೳ OHJOY QIQGQN ブラウザ nginx php-fpm HTTP FastCGI 外部 サーバ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 27
  14. • ੩తFQPMM /PO#MPDLJOH*0ʹΑΔߴฒྻੑ • ಈతִ཭͞Εͨগ਺ͷϓϩηεʹΑΔ҆શੑ • OHJOYͷڧΈঢ়گʹԠͯ͡ಈ࡞ϞσϧΛ࢖͍෼͚Δ OHJOYͷ੩తPSಈతίϯςϯπॲཧ 静的 リクエスト

    nginx レスポンス 直接応答 動的 リクエスト nginx php-fpm nginx レスポンス リバースプロクシがFastCGIへ中継 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 28
  15. ˞શͯͷ)551ϦΫΤετʹର͠ʮ0,ʯͱ͚ͩฦ͢8FCαʔόΛܭଌͱಉҰͷϚγϯͰىಈ ͠ʮฒྻ ºճ ສϦΫΤετʯૹ৴ͨ͠ࡍͷϨεϙϯελΠϜ 'BTU$(*΁ͷʮ઀ଓʯίετ͸ʁ nginx + php-fpm Apache +

    mod_php 倍率 Avg 2.72ms 1.80ms 1.51x Median 3.00ms 2.00ms 1.50x 95pct 3.00ms 2.00ms 1.50x 実測で1msの差。ただし全ての動的レスポンスに確実に積み上がる。 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 29
  16. $%/ߏ੒Ͱͷ8FCαʔόͷ໾ׂ 責務 CDNなし CDNあり 接続のハンドリング nginx CDN 接続の集約 nginx CDN

    バッファリング nginx CDN 静的コンテンツ nginx S3 動的コンテンツ php-fpm or mod_php php-fpm or mod_php nginx + php-fpm ブラウザ CloudFront S3 nginx php-fpm 静的 動的 FastCGI Apache + mod_php ブラウザ CloudFront S3 Apache + mod_php 静的 動的 接続コスト = ゼロ ✓ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 30
  17.  ʮ઀ଓʯͷجຊ֓೦ͱ)551  ΞϓϦέʔγϣϯ΁ͷʮ઀ଓʯ  σʔλϕʔε΁ͷʮ઀ଓʯ  Ωϟογϡ΁ͷʮ઀ଓʯ  ֎෦"1*΁ͷʮ઀ଓʯ

     ઀ଓ͸ੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 32
  18.  5$1઀ଓཱ֬  5-4ϋϯυγΣΠΫ  ೝূϋϯυγΣΠΫ  όοΫΤϯυϓϩηεىಈ • %#ͷϓϩηε؅ཧίετ͸8FCαʔόΑΓܻҧ͍ʹߴ͍

    1)1ͷσϑΥϧτಈ࡞ • ϦΫΤετ͝ͱʹ઀ଓΛཱ֬͠ɺऴྃ࣌ʹ੾அ • όοΫΤϯυϓϩηε͸ىಈͱऴྃΛ܁Γฦ͢ %#઀ଓͷίετ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 33
  19. ࣋ଓ઀ଓʢ1FSTJTUFOU$POOFDUJPOʣ use Pdo¥Pgsql; $pdo = new Pgsql('pgsql:', options: [ //

    持続接続: プロセス毎に接続を維持 Pgsql::ATTR_PERSISTENT ]) ; // Laravel: config/database.php 'pgsql' => [ // ...既存の設定... 'options' => [ Pgsql::ATTR_PERSISTENT => true, ], ], )551ʹ͓͚Δ,FFQ"MJWFͱಉ͡ൃ૝ •໾ׂΛऴ͑ͨ઀ଓΛ࠶ར༻ճ໨Ҏ߱͸θϩίετ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 34
  20. ࣋ଓ઀ଓͷϕϯνϚʔΫ ඇ࣋ଓ઀ଓ ࣋ଓ઀ଓ ഒ཰ ઀ଓ .FEJBO NT NT  Y

    ઀ଓ Q NT NT  Y ΫΤϦ .FEJBO NT NT Y ΫΤϦ Q NT NT Y 接続コストの消滅に加えクエリ性能も向上 ※計測と同一のマシンで稼働するPostgreSQLに対しUNIXドメインソケット経由で接続し SELECT 1 を 10,000回発行。 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 35
  21. ো֐ྫ঎඼ߪೖ࣌ͷ"1*ϦΫΤετࣦഊ  ର৅঎඼Λ4&-&$5'0361%"5&ͰϩοΫ  ܾࡁ"1*ίʔϧ ˠλΠϜΞ΢τ  Ϣʔβʔʹ͸஫จࣦഊΛฦ͠Ϩεϙϯε͸ऴྃ  30--#"$,͞Εͳ͍··઀ଓ͕࣋ଓ

     Ҏ߱ɺಉ͡঎඼Λങ͓͏ͱ͢ΔͱશͯλΠϜΞ΢τ  ʮ8FCαʔόΛ࠶ىಈͨ͠Β௚ͬͨʯˠݪҼෆ໌ %#઀ଓ͸ঢ়ଶΛ࣋ͭ ࣋ଓ઀ଓͷϦεΫঢ়ଶͷ࢒ཹ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 36
  22. • ηογϣϯม਺ɾҰ࣌ςʔϒϧ • લͷϦΫΤετͷ৘ใ͕ผͷϦΫΤετ΁࿙Ӯ • ϓϦϖΞυεςʔτϝϯτ • BMSFBEZFYJTUTΤϥʔ • קࠂϩοΫ

    • ղ์͞ΕͣҎ߱ͷϦΫΤετΛશͯϒϩοΫ ࣋ଓ઀ଓΛ҆શʹ࢖͑Δ͔͸ʮυϥΠόͷ࣮૷࣍ୈʯ ͦͷଞͷঢ়ଶ࢒ཹϦεΫ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 37
  23. 1)1QEP@QHTRMঢ়ଶϦηοτ 1)1 • τϥϯβΫγϣϯ • ✅Ϩεϙϯεऴྃ࣌ʹղ์ • ϓϦϖΞυεςʔτϝϯτ • ✅ແ໊εςʔτϝϯτ͸҆શ

    • ❌໊લ෇͖εςʔτϝϯτ͸িಥ • ❌্هҎ֎͸શͯ࢒ཹ 1)1 • ✅ঢ়ଶ͸શͯϦηοτ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 38
  24. %#઀ଓ਺1)1ϓϩηε਺ º αʔό୆਺ • 8FCαʔόͷεέʔϧΞ΢τ͕جຊ • %#઀ଓ਺͸εέʔϧΞ΢τͱڞʹ૿͑Δ • %#αʔό͸εέʔϧΞοϓ͕جຊ •

    શαʔό͔Βͷ%#઀ଓΛ୆Ͱड͚Δ 8FCαʔόͷεέʔϧΞ΢τ͕ %#઀ଓ਺ރׇΛট͘ϦεΫ εέʔϧಛੑͱ%#઀ଓ਺ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 39
  25. $%/-#ͱಉ͡ʮؒʹϓϩΫγΛڬΉʯύλʔϯ • /ຊͷΞϓϦ઀ଓΛ.ຊͷ%#઀ଓʹू໿ʢ./ʣ ଞݴޠͰ͸'8ϥΠϒϥϦʹ઀ଓϓʔϥʔ͕಺ଂ • +BWB)JLBSJ$1 • (PEBUBCBTFTRM • 3BJMT"DUJWF3FDPSE

    ଟ͘ͷ઀ଓϓʔϥʔ͸ঢ়ଶ؅ཧ΍ॳظԽͷػೳΛ಺ଂ ઀ଓϓʔϥʔ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 40
  26. ࣋ଓ઀ଓΛʮͲͷఔ౓࠶ར༻͢Δ͔ʯબ୒Մೳ • 4FTTJPOΫϥΠΞϯτ઀ଓ୯ҐʢσϑΥϧτʣ • ੍໿ͳ͠ɾޮ཰௿ • 5SBOTBDUJPOτϥϯβΫγϣϯ୯Ґ ʢਪ঑ʣ • ޮ཰ߴɾҰ෦ػೳΛར༻ෆՄ

    • 4UBUFNFOU42-จ୯Ґʢಛघ༻్ʣ • ࠷ߴޮ཰ɾτϥϯβΫγϣϯෆՄ ػೳͱੑೳͷͲͪΒΛ༏ઌ͢Δ͔Ͱબ୒ 1H#PVODFSʢϛυϧ΢ΣΞܕʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 42 機能 性能
  27. • ௨ৗ͸1H#PVODFSͷ5SBOTBDUJPOϞʔυ૬౰ • ϐϯཹΊ4FTTJPOϞʔυ΁ͷࣗಈ੾Γସ͑ • 4&5΍קࠂϩοΫ౳ͰΞϓϦͱ%#ͷ઀ଓ͕ݻఆ͞ΕΔ • ʮঢ়ଶ࢒ཹϦεΫʯͱ׬શʹରԠ • ΞϓϦ઀ଓͷ੾அͰݻఆ͕ղআ͞ΕΔ

    • 3%41SPYZ΁ͷ઀ଓ͸࣋ଓͯ͠͸͍͚ͳ͍ʢݻఆղআͰ͖ͳ͍ʣ ಈ࡞ʹԠͯ͡ੑೳ͕ࣗಈతʹมΘΔ 3%41SPYZʢϚωʔδυαʔϏεܕʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 43
  28. • ʮ઀ଓʯͷίετ͸)551Ҏ্ʹߴ͍ • ࣋ଓ઀ଓͰίετΛେ෯࡟ݮ • ʮ઀ଓҡ࣋ʯͷίετ΋)551Ҏ্ʹߴ͍ • 8FCαʔόεέʔϧΞ΢τ ˠ઀ଓރׇ ˠଈো֐

    • ઀ଓ͕ঢ়ଶΛ࣋ͭϦεΫ • σʔλͷ࿙Ӯ΍ଛࣦɺো֐ʹܨ͕Δ͓ͦΕ • ઀ଓϓʔϥʔͰτϨʔυΦϑΛ͋Δఔ౓ղফ • ֎෦ͷϛυϧ΢ΣΞ΍1BB4Λ׆༻ ͜͜·Ͱͷ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 44
  29.  ʮ઀ଓʯͷجຊ֓೦ͱ)551  ΞϓϦέʔγϣϯ΁ͷʮ઀ଓʯ  σʔλϕʔε΁ͷʮ઀ଓʯ  Ωϟογϡ΁ͷʮ઀ଓʯ  ֎෦"1*΁ͷʮ઀ଓʯ

     ઀ଓ͸ੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 45
  30. Ωϟογϡ΁ͷ࣋ଓ઀ଓ // Memcached: `$persistent_id` を指定 $memcached = new Memcached('接続を識別するID'); $memcached->addServer('localhost',

    11211); // Redis: `pconnect()`メソッド $redis = new Redis(); $redis->pconnect('localhost', 6379); // Laravel - Memcached: config/cache.php - 抜粋 'memcached' => [ 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), ], // Laravel - Redis: config/database.php - 抜粋 'redis' => [ 'options' => [ 'persistent' => env('REDIS_PERSISTENT', false), ], ], )551ɾ%#ͱಉ͡ߟ͑ํ •઀ଓཱ֬ʹ͸ίετ͕͔͔Δ • ˠ࣋ଓ઀ଓͰ࠶ར༻͍ͨ͠ )551ɾ%#ͱҟͳΔߟ͑ํ •ಉ࣌઀ଓ΍ฒྻॲཧʹڧ͍ • ˠ઀ଓ਺͸ؾʹ͠ͳͯ͘ྑ͍ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 46
  31. Ωϟογϡ࣋ଓ઀ଓͷϕϯνϚʔΫ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 47 3FEJT ඇ࣋ଓ઀ଓ ࣋ଓ઀ଓ

    ഒ཰ ઀ଓ "WH NT NT Y ઀ଓ .FEJBO NT NT Y ઀ଓ Q NT NT Y .FNDBDIFE ඇ࣋ଓ઀ଓ ࣋ଓ઀ଓ ഒ཰ (&5"WH NT NT Y (&5.FEJBO NT NT Y (&5Q NT NT Y ※php-memcachedは最初のコマンド実行まで接続を遅延するためGETでベンチマーク(この表はRedis とMemcachedの比較にはならない)
  32. ઀ଓ͕ঢ়ଶΛ͔࣋ͭʁ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 48 Memcached: 接続は状態を持てない(HTTPと同じ考え方) コマンドは全てアトミックに動作

    → 持続接続を常に安全に利用できる Redis: 接続は状態を持てる—PhpRedisの持続接続は状態を持つ ػೳ ίϚϯυ ࢒ཹ ڍಈͱϦεΫ τϥϯβΫγϣϯ .6-5* ͠ͳ͍ ࣋ଓ઀ଓ͸ϦΫΤετऴྃ࣌ʹڧ੍੾அ ೝূ "65) ͢Δ ϚϧνςφϯτܕΞϓϦέʔγϣϯͰ৘ใ࿙Ӯ ָ؍ϩοΫ 8"5$) ͢Δ σʔλ૕ࣦ΍τϥϯβΫγϣϯࣦഊ %#੾Γସ͑ 4&-&$5/ ͢Δ ϚϧνςφϯτܕΞϓϦέʔγϣϯͰ৘ใ࿙Ӯ 1VC4VC 46#4$3*#& ͢Δ શͯͷίϚϯυ͕ࣦഊ DB接続の「状態残留リスク」と同じ構造
  33. • 3FEJTͷঢ়ଶ࢒ཹ͸ʮ୯७ͳ,74ʹ͸ෆཁͳػೳʯʹىҼ • (&54&5%&-&5&͚ͩͳΒঢ়ଶ͸࢒ཹ͠ͳ͍ • ͔͠͠'8΍ϥΠϒϥϦ͕҉໧తʹ4&-&$5Λൃߦ͍ͯ͠ͳ͍͔ʁ • ͔͠͠কདྷతʹτϥϯβΫγϣϯ΍1VC4VCΛ࢖Θͳ͍อূ͸͋Δ͔ʁ • SFEJTSFTFU

    Ͱ ࠶ར༻લʹඞͣϦηοτ Š%#࣋ଓ઀ଓͱಉ͡ݪଇ • .FNDBDIFE͸ߏ଄తʹঢ়ଶ࢒ཹ͕ൃੜ͠ͳ͍ ʮෆཁͳػೳʯͷݟۃΊ͸ʮඞཁͳػೳʯͱಉ͘͡Β͍ॏཁ 3FEJTͱ.FNDBDIFEͷ࣋ଓ઀ଓͱঢ়ଶ؅ཧ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 49 ؍఺ .FNDBDIFE 3FEJT ઀ଓͷঢ়ଶ εςʔτϨε εςʔτϑϧ ࣋ଓ઀ଓ ҆શʹར༻Մೳ खಈͰঢ়ଶϦηοτ ઀ଓͷঢ়ଶ؅ཧ ෆཁ %#੾Γସ͑౳ͰෳࡶԽ
  34. • Ωϟογϡͷ࣋ଓ઀ଓ͸޻਺ରޮՌ͕ߴ͍ • ߴස౓ΞΫηε͕લఏ ˠ࣋ଓ઀ଓͷޮՌ͕ಛʹେ͖͍ • ฒྻॲཧ͕ಘҙ ˠ઀ଓ਺Λؾʹͤͣ࣋ଓ઀ଓΛ࢖͑Δ • ҆શੑ͸ʮ઀ଓ͕ঢ়ଶΛ͔࣋ͭʯͰܾ·Δ

    • .FNDBDIFEεςʔτϨε ˠ҆શʹར༻Մೳ • 3FEJTεςʔτϑϧ ˠ։ൃऀ͕ঢ়ଶ؅ཧΛߦ͏ ͜͜·Ͱͷ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 50
  35.  ʮ઀ଓʯͷجຊ֓೦ͱ)551  ΞϓϦέʔγϣϯ΁ͷʮ઀ଓʯ  σʔλϕʔε΁ͷʮ઀ଓʯ  Ωϟογϡ΁ͷʮ઀ଓʯ  ֎෦"1*΁ͷʮ઀ଓʯ

     ઀ଓ͸ੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 51
  36. )551ϦΫΤετΛʮૹΔʯ৔߹΋ಉ͡ߏ଄ • 5$1઀ଓཱ֬ ˠ5-4ϋϯυγΣΠΫ ˠϦΫΤετ ˠϨεϙϯε • ઀ଓͷίετ͸ɺϦΫΤετΛʮૹΔଆʯʹ΋ൃੜ ͢Δʢࣗ෼ୡ͕خ͍͠ʣ •

    ʮૹΔଆʯͷίετ࡟ݮ͸ʮड͚Δଆʢ֎෦"1*ʣʯ ʹ΋޷Өڹʢ૬ख͕خ͍͠ʣ ֎෦"1*΁ͷϦΫΤετͱ,FFQ"MJWF 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 52
  37. (V[[MFͷ઀ଓ࠶ར༻ $client = new ¥GuzzleHttp¥Client([ 'base_uri' => 'https://example.com' ]); //

    最初のリクエスト: 新規接続確立 $client->get('/users'); // 同一ドメインへ再度: 接続を再利用 $client->get('/orders'); •DVSM (V[[MF͸,FFQ"MJWFඪ४ରԠ •ಉ͡ϋϯυϥͳΒ઀ଓ͸࠶ར༻͞ΕΔ •ಉҰϦΫΤετ಺ͷΈͰ༗ޮ •ϦΫΤετΛލ͙ͱ࠶ར༻͞Εͳ͍ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 53
  38. -BSBWFM)551ϑΝαʔυͷ઀ଓ࠶ར༻ use GuzzleHttp¥Client; $client = new Client([ 'base_uri' => 'https://example.com',

    ]); Http::setClient($client)->get('/users'); Http::setClient($client)->get('/orders'); • ,FFQ"MJWF͸σϑΥϧτඇରԠ • δϣϒϫʔΧʔͳͲͰ5PPNBOZPQFOGJMFT Λ༠ൃ͢ΔΤοδέʔε MBSBWFMGSBNFXPSL • )551΍%#ͰͷϦιʔεރׇͱಉ͡ߏ଄ͷ໰୊ • ར༻͢Δ৔߹(V[[MF$MJFOUΛࣗ෼Ͱ؅ཧ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 54
  39. 1)1DVSM@TIBSF@JOJU@QFSTJTUFOU // リクエストを跨いで再利用可能 $sh = curl_share_init_persistent('my-pool', [ CURL_LOCK_DATA_DNS, CURL_LOCK_DATA_CONNECT, CURL_LOCK_DATA_SSL_SESSION,

    ]); $client = new ¥GuzzleHttp¥Client([ 'curl' => [CURLOPT_SHARE => $sh], ]); // ❌このコードは ValueError が発生する $sh = curl_share_init_persistent('my-pool', [ /* 省略 */ CURL_LOCK_DATA_COOKIE, ]); ैདྷͷ՝୊ • DVSMϋϯυϥͷ࣋ଓ઀ଓ͸ϦΫΤ ετΛލ͍Ͱ࠶ར༻Ͱ͖ͳ͔ͬͨ 1)1 • ϦΫΤετΛލ͙࠶ར༻͕αϙʔ τ͞Εͨ ঢ়ଶʮ࿙Ӯʯ΁ͷରॲ • $PPLJF৘ใΛؚΉ࣋ଓ઀ଓ͸ϦΫ ΤετΛލ͛ͳ͍ʢ҆શʣ (V[[MFͷରԠঢ়گ • ٞ࿦தHV[[MFHV[[MF • ཁ͸͕࣌ؒແ͍ʢ13׻ܴʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 55
  40.  ʮ઀ଓʯͷجຊ֓೦ͱ)551  ΞϓϦέʔγϣϯ΁ͷʮ઀ଓʯ  σʔλϕʔε΁ͷʮ઀ଓʯ  Ωϟογϡ΁ͷʮ઀ଓʯ  ֎෦"1*΁ͷʮ઀ଓʯ

     ઀ଓ͸ੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 57
  41. .BY3FRVFTU8PSLFST1)1ϓϩηε਺ Λݻఆͨ͠৔߹ ࠷ऴతʹεϧʔϓοτΛܾΊΔͷ͸Կ͔ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 60 PHPプロセス数

    平均レスポンスタイム 処理可能な秒間リクエスト 100 1ms 100,000 100 10ms 10,000 100 10,000ms 10 100 100,000ms 1 レスポンスタイムをn倍速くすれば、全体のキャパシティもn倍になる
  42. NFNPSZ@MJNJU͕ద੾ʹઃఆ͞Ε͍ͯΕ͹ • Πϯελϯεຖͷڐ༰Մೳͳ઀ଓ਺͸ݟੵ΋ΕΔ • ੑೳཁ݅ΑΓΠϯελϯεͷαΠζͱ਺Λݟੵ΋ΕΔ ݟੵ΋Εͳ͍ྫ 1)1ϓϩηε਺ͷݶքΛܾΊΔͷ͸Կ͔ 2026/3/21 #phperkaigi #b

    「接続」— パフォーマンスチューニングの最後の一手 61 memory_limit MaxRequestWorkers 必要メモリ 32MB 100 3.2GB 1GB 100 100GB NFNPSZ@MJNJUº.BY3FRVFTU8PSLFST࠷େϝϞϦ࢖༻ྔ # エクスポート機能のため上限緩和 memory_limit = 2G
  43. ඞཁͳ৔߹͚ͩ૿ྔ͢Δ // php.iniの設定値を一時的に変更するLaravelミドルウェア class PhpIniSet { public function handle( Request

    $request, ¥Closure $next, string $name, string $value ): Response { ini_set($name, $value); return $next($request); } } // 特定のルートだけメモリ上限を引き上げ Route::get('/logs/xlsx', ...) ->middleware( PhpIniSet::class . ':memory_limit,2G’ ); શମ͸গͳ͘ɺඞཁͳ͚࣌ͩଟ͘ •NFNPSZ@MJNJU͸ʮయܕతͳॲཧʯͰ ඞཁͳ஋ •ॏ͍ॲཧ͸ݸผʹΦϓτΠϯ Πϯϑϥ୲౰ऀ •NFNPSZ@MJNJUͰ֓ࢉΛݟੵ΋Δ ΞϓϦ୲౰ऀ •ॲཧʹԠͯ͡ہॴతʹ૿ྔ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 62
  44. ܭࢉ͸ਖ਼͔͔ͬͨ͠ʁԾઆʹޡΓ͸ͳ͔͔ͬͨʁ ܭଌ͢Δ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 64 サーバ 設定項目

    Apache mod_log_config nginx ngx_http_log_module php-fpm access-format Laravel RequestHandledイベント サーバ 設定項目 Apache mod_status nginx stub_status php-fpm pm.status_path レスポンスタイムの計測 ワーカー稼働状況の計測
  45. ྫ"QBDIFNPE@TUBUVT $ w3m localhost/server-status Apache Server Status for localhost (via

    ::1) Server Version: Apache/2.4.66 (Debian) Server MPM: prefork Server Built: 2025-12-05T18:52:34 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Current Time: Saturday, 14-Mar-2026 14:32:04 JST Restart Time: Thursday, 19-Feb-2026 21:15:04 JST Parent Server Config. Generation: 24 Parent Server MPM Generation: 23 Server uptime: 22 days 17 hours 17 minutes Server load: 0.19 0.25 0.15 Total accesses: 4162932 - Total Traffic: 75.7 GB - Total Duration: 198129127 CPU Usage: u787.2 s354.53 cu29342.1 cs9871.63 - 2.06% CPU load 2.12 requests/sec - 40.5 kB/second - 19.1 kB/request - 47.5936 ms/request 31 requests currently being processed, 0 workers gracefully restarting, 80 idle workers K_W_K_K_W__K_R_K_C_K_W_K__K_W__K_R_C_K_W_K__K_W__C_K_W_K_W__K___K...K___K_______ _____________..._______________..._______ Scoreboard Key: "_" Waiting for Connection, "S" Starting up, "R" Reading Request, "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup, "C" Closing connection, "L" Logging, "G" Gracefully finishing, "I" Idle cleanup of worker, "." Open slot with no current process ಋೖํ๏  -PBE.PEVMFͰ༗ޮԽ  63-ެ։͠ΞΫηε੍ݶΛઃఆ Ӿཡํ๏ • ެ։63-΁ΞΫηε • BVUPͰςΩετऔಘ΋Մೳ औಘͰ͖Δ৘ใ • ্൒෼αʔόىಈ͔Βͷྦྷੵ৘ใ • Լ൒෼ݱࡏͷεφοϓγϣοτ • ࠓճ͸4DPSFCPBSEʹ஫໨ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 65
  46. 4DPSFCPBSEͷಡΈํ݈શͳঢ়ଶ ه߸ͷҙຯ • ˙_ ϦΫΤετ଴ͪ • ˙R ϦΫΤετड৴த • ˙W

    Ϩεϙϯεૹ৴த • ˙K ઀ଓҡ࣋த ݈શͳΞϓϦέʔγϣϯ • リクエストが増えても W͸ಈ͔ͳ͍ • Kͷ૿ݮ͸ਖ਼ৗͳڍಈ • _ˠRˠWˠKˠRˠ ,FFQ"MJWF͕݈શʹαΠΫϧ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 66
  47. 4DPSFCPBSEͷಡΈํো֐ͱͦͷஹީ 4FOEJOH3FQMZͷ૿ՃʢϨεϙϯελΠϜͷѱԽʣ • τϥϑΟοΫʹԠͨ͡8૿Ճ͸ཁ஫ҙαΠϯ • 8͚ͩٸ૿͢Δύλʔϯ͸ΫϦςΟΧϧ • εϥογϯάɾഉଞϩοΫɾσουϩοΫͳͲΛٙ͏ 8BJUJOH͕θϩʹ͍ۙͮͨΒةݥ •

    , 8 ͕࠷େಉ࣌઀ଓ਺ʹഭ͍ͬͯͳ͍͔֬ೝ • ࠷େಉ࣌઀ଓ਺΁౸ୡো֐ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 67
  48. ਖ਼ͱෛͷϑΟʔυόοΫϧʔϓ Ϧτϧͷ๏ଇL = λ × W • L: ฏۉ଺ཹ਺ʢγεςϜ಺ͷ઀ଓ૯਺ʣ •

    λ: ౸ண཰ʢ୯Ґ࣌ؒ͋ͨΓͷ઀ଓཁٻ਺ʣ • W: ฏۉ଺ࡏ࣌ؒʢड෇͔Β׬ྃ·Ͱͷॴཁ࣌ؒʣ Е͕Ұఆͷͱ͖ɺ8Λ൒෼ʹ͢Ε͹-΋൒෼ʹ Ϧιʔεڝ߹ͷ؇࿨ -͕ݮΔͱϓϩηεؒͷୣ͍߹͍͕ݮΓɿ • ίϯςΩετεΠονͷଟൃ͕ऩ·Δ • ϝϞϦஅยԽ͕؇࿨͞ΕΔ • εϥογϯά͕཈੍͞ΕΔ ϑΟʔυόοΫϧʔϓ • ࣗݾڧԽϧʔϓʢ-ͷݮগ͕8Λߋʹ୹ॖͤ͞Δʣ • ٯ͸σεεύΠϥϧʢʮಥવɺݶքΛ௒͑Δʯݱ৅ʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 68 自己強化ループ 逆はデススパイラル Wの短縮 Lの減少 リソース競合の緩和 キューイング遅延↓
  49. • ʮ઀ଓʯ͸͢΂ͯͷϦΫΤετʹඞͣొ৔͢Δ • ϨεϙϯελΠϜʹର͠ੵΈ্͛ࣜʹ࡞༻͢Δ • ࠷దԽͷجຊݪཧ͸ڞ௨ʢ࣋ଓɾղ์ɾதؒ૚Ͱͷ࠷దԽʣ • ࠷ऴతʹεϧʔϓοτΛܾΊΔͷ͸ΞϓϦέʔγϣϯ • ઀ଓͷ࠷దԽ͸ඞཁ৚݅Ͱ͋Γɺͦͷ౔୆Λ੔͑Δʮ࠷ޙͷҰखʯ

    • ʮಛఆͷՕॴʯͷνϡʔχϯά͸ґવͱͯ͠ॏཁ • ʮ࠷ޙͷҰखʯ͸࣍ͷվળαΠΫϧͷ౔୆ • શମ͕࠷దԽ͞Εͯ৽ͨͳϘτϧωοΫ͕ݦࡏԽ͢Δ͜ͱ΋ • ࣌ʹ͸؅׋Λඈͼӽ͑ͯશମΛݟΔࢹ࠲΋ඞཁ ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 69