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
composer dump-autoloadを「なんとなく使う」から「理解して使う」になる
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Akinori Takigawa
June 21, 2024
Technology
4.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
composer dump-autoloadを「なんとなく使う」から「理解して使う」になる
Akinori Takigawa
June 21, 2024
More Decks by Akinori Takigawa
See All by Akinori Takigawa
Nginxになりきって、FCGIでPHPと喋ろう
akinoriakatsuka
0
91
PHPUnitのテストイベントを使ってテストにかかる時間の計測をしよう
akinoriakatsuka
0
160
パイプ演算子の実装を 覗いてみよう
akinoriakatsuka
0
240
PHPでCQRS+ES入門
akinoriakatsuka
0
240
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
940
Rubyで作る物理エンジン - 叡電LT
akinoriakatsuka
0
44
パイプ演算子の実装を覗いてみよう - 【非公式】PHPカンファレンス福岡2025・前日Meetup
akinoriakatsuka
0
52
技術的負債の会計学 - PHPカンファレンス広島2025
akinoriakatsuka
8
1.6k
スクラムをちゃんとやる勇気
akinoriakatsuka
0
75
Other Decks in Technology
See All in Technology
Compose 新機能総まとめ / What's New in Jetpack Compose
yanzm
0
140
CIで使うClaude
iwatatomoya
0
110
product engineering with qa
nealle
0
150
Road to SRE NEXTの今までとこれから
hiroyaonoe
0
130
Claude Code 珍プレー好プレー
shinyasaita
0
270
FinOps X 2026 Recap from Engineer Side #JapanFinOps
chacco38
0
260
4人目のSREはAgent
tanimuyk
0
400
Text-to-SQLをAgentCoreで実現し、生成されるSQLの精度を定量的に評価する
yakumo
2
630
SRE依存からの脱却 運用を開 発チームへ移す、 フルサイ クル開 発体制の実践
joooee0000
0
670
ローカルLLMとLINE Botの組み合わせ その3 / LINE DC Generative AI Meetup #8
you
PRO
0
110
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
2
1.7k
SRE Lounge Hiroshimaへの招待
grimoh
0
310
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Designing Experiences People Love
moore
143
24k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Fireside Chat
paigeccino
42
4k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
670
How STYLIGHT went responsive
nonsquared
100
6.2k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Skip the Path - Find Your Career Trail
mkilby
1
160
How to Ace a Technical Interview
jacobian
281
24k
Transcript
1 / 34 composer dump-autoload を 「なんとなく使う」から 「理解して使う」になる あかつか PHP
カンファレンス福岡2024 6/22 #phpconfuk
2 / 34 自己紹介 あかつか / @aki_artisan 神戸でPHP を書いています 株式会社オフショア
レガシーシステムのLaravel への移行プロジェクト中 役割はプロジェクトリーダー
3 / 34 こんなシステムつくってます
composer dump-autoload 使ったことありますか?
理解して使っていますか?
6 / 34 おしながき 1. composer dump-autoload とは 1. autoload
の種類 2. autoload の最適化 3. dump-autoload が必要なタイミング 4. dump-autoload の裏側で起こっていること 5. まとめ
7 / 34 と、そのまえに なんか聞いたことあるタイトルだなと思ったあなた 正解です
composer dump-autoload とは
9 / 34 composer dump-autoload とは autoload の設定とファイルの状態から、autoload が使える状態にしてくれる コマンド
内部では、 composer.json の設定に応じて、 vendor/composer/ 以下のファイルを書き換えている→後で詳しく解説 autoload とは、未定義のクラスが呼ばれた時にファイルを探して自動で読み 込んでくれる仕組み 詳しくは私のPHP カンファレンス関西の資料をご参照ください
10 / 34 autoload の種類 1. PSR-4 2. PSR-0 (非推奨)
3. classmap 4. files (ファイルの読み込みであり、クラスの読み込みではない) composer で実装されているautoload の種類
11 / 34 PSR-4 名前空間とディレクトリを紐づける App 名前空間を src src2 ディレクトリに結びつける場合
同じ名前空間に、複数のディレクトリを設定することも可能 両方のディレクトリにファイルがある場合は先に書いたものが優先される { "autoload": { "PSR-4": { "App\\": [ "src/", "src2/" ] } } }
12 / 34 classmap 指定したファイルや指定したディレクトリ配下のファイルとクラス名のマッ ピングを登録する dump-autoload 時にファイルを解析して、マッピングを設定してくれる classmap とPSR-4
に、同じクラスがある場合はclassmap が優先される { "autoload": { "classmap": ["src/", "lib/", "Something.php"] } }
13 / 34 files 他のautoload は遅延ロードだが、これは先に読み込まれる。 ヘルパー関数を定義したファイルなどに使う { "autoload": {
"files": ["src/MyLibrary/functions.php"] } }
autoload の最適化
15 / 34 autoload の最適化 dump-autoload の必要性を判断するにあたって、 autoload の最適化を知っておく必要がある。 ※
キャッシュのようなもの ゆるい最適化(-o オプション) きつい最適化(-a オプション)
16 / 34 composer dump-autoload -o PSR-4, PSR-0 の設定されたディレクトリを解析して、classmap を生成する
classmap で見つからなかったら、ディレクトリから探してくれる composer.json に "optimize-autoloader": true がある場合も
17 / 34 composer dump-autoload -a PSR-4, PSR-0 の設定されたディレクトリを解析して、classmap を生成する
classmap で見つからない場合は、見つからずにエラーになる composer.json に "classmap-authoritative": true がある場合も
dump-autoload が必要な タイミング
19 / 34 dump-autoload が必要なタイミング PSR-4, PSR-0 の設定を追加した時 classmap のディレクトリやファイルを追加した時
files のファイルリストを変更した時
20 / 34 dump-autoload が要らないタイミング PSR-4, PSR-0 の設定のあるディレクトリでファイルを追加した時 ただし、最適化されてdump-autoload されている場合は別途考慮が必要
例えば、-o とか -a でclassmap に登録されていたクラス定義ファイル を別の場所に移動したい場合は dump-autoload 必要
dump-autoload の裏側で 起こっていること
22 / 34 dump-autoload の裏側で起こっていること vendor/composer/ 以下のファイルが書き換わっている これによってautoload できるファイルが変わる 特に大事なのは、
autoload_real.php と autoload_static.php composer.json に書いた設定と、実際のファイルからautoload が動く状態 にする
23 / 34 dump-autoload の裏側で起こっていること optimize なしのPSR-4 は、ディレクトリと名前空間の紐付けだけが登録され る classmap
は、ファイルとクラスの紐付けが登録される optimize ありのPSR-4 は、 ファイルとクラスの対応がclassmap として登録される →なので、PSR-4 でディレクトリを追加しないときでも dump-autoload が必要になる場合がある
24 / 34 実際のファイルはこんな感じ autoload_static.php class ComposerStaticInitd751713988987e9331980363e24189ce { public static
$files = array ( '41da55927f7e15e2e05566a733ef4ad4' => __DIR__ . '/../..' . '/functions.php', ); // [...] public static $prefixDirsPsr4 = array ( 'App\\' => array ( 0 => __DIR__ . '/../..' . '/src', 1 => __DIR__ . '/../..' . '/src2', ), );
25 / 34 -o オプションで実行しています public static $classMap = array
( 'App\\Animal\\Cat' => __DIR__ . '/../..' . '/classmap/Cat.php', 'App\\Animal\\Dog' => __DIR__ . '/../..' . '/src/Animal/Dog.php', 'App\\Animal\\Elephant' => __DIR__ . '/../..' . '/src/Animal/Elephant.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'SomeVendor\\Animal\\Turtle' => __DIR__ . '/../..' . '/classmap/SomeVendor/Hoge.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInitd751713988987e9331980363e24189ce::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInitd751713988987e9331980363e24189ce::$prefixDirsPsr4; $loader->classMap = ComposerStaticInitd751713988987e9331980363e24189ce::$classMap; }, null, ClassLoader::class); } }
まとめ
27 / 34 まとめ PSR-4 とPSR-0 は設定追加時のみ必要 files はファイルリストを変更した時に必要 classmap
は、設定追加時とファイル追加時に必要 optimize に気をつけよう 正体はclassmap classmap に登録された設定を更新する時は必要 困ったら、autoload_static.php を確認しよう
おまけ(時間が余れば)
29 / 34 細かい話 composer でインストールするパッケージも同じファイルにオートロードの 設定が書かれる composer require や
composer install でパッケージを追加した時も、 dump-autoload が走る なので、optimize の設定はcomposer.json に書いておくとよい(忘れ防 止)
30 / 34 細かい話 最適化すべきタイミング It should always be enabled
in production. と書かれている 本番環境では常に有効にしておくべき 逆に開発時はYou should not enable any of these optimizations in development
31 / 34 トラブルシューティング 目的のファイルが読み込まれなくて困った! var_dump(get_included_files()); include したファイルを配列で出してくれる array(10) {
[0]=> string(58) "/path/to/dir/main.php" [1]=> string(69) "/path/to/dir/vendor/autoload.php" [2]=> string(83) "/path/to/dir/vendor/composer/autoload_real.php" [3]=> string(81) "/path/to/dir/vendor/composer/ClassLoader.php" [4]=> string(85) "/path/to/dir/vendor/composer/autoload_static.php"
32 / 34 [5]=> string(63) "/path/to/dir/functions.php" [6]=> string(68) "/path/to/dir/src/Animal/Dog.php" [7]=>
string(66) "/path/to/dir/classmap/Cat.php" [8]=> string(73) "/path/to/dir/src/Animal/Elephant.php" [9]=> string(78) "/path/to/dir/classmap/SomeVendor/Hoge.php" }
Thank you!
34 / 34 参考文献 https://getcomposer.org/doc/04-schema.md#autoload https://getcomposer.org/doc/articles/autoloader-optimization.md https://zenn.dev/fagai/articles/bc9ebc01bd7f42