Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
composer dump-autoloadを「なんとなく使う」から「理解して使う」になる
Search
Akinori Takigawa
June 21, 2024
Technology
5.1k
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
120
PHPUnitのテストイベントを使ってテストにかかる時間の計測をしよう
akinoriakatsuka
0
230
パイプ演算子の実装を 覗いてみよう
akinoriakatsuka
0
330
PHPでCQRS+ES入門
akinoriakatsuka
0
240
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
1.2k
Rubyで作る物理エンジン - 叡電LT
akinoriakatsuka
0
55
パイプ演算子の実装を覗いてみよう - 【非公式】PHPカンファレンス福岡2025・前日Meetup
akinoriakatsuka
0
62
技術的負債の会計学 - PHPカンファレンス広島2025
akinoriakatsuka
8
1.7k
スクラムをちゃんとやる勇気
akinoriakatsuka
0
78
Other Decks in Technology
See All in Technology
プロダクト価値を、 チームが使える判断軸に変える
vivion
0
130
Kernel testing frameworks
ennael
PRO
0
110
契約書画像からの情報抽出に特化した視覚接地モデルを育てる話
sansantech
PRO
1
150
自律型 AI をセキュアに実装!Gemini と MIG で作る動的コード実行環境
recruitengineers
PRO
1
220
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
140
全人類(ほぼ)AWS Organizations の上でAWSを利用している、その世界を知る話
htan
0
120
Claude Code本は、どのように執筆チームで書かれたか
oikon48
0
290
予測不能な実行エージェントを安全にサクッと試せるサンドボックス環境の話
sansantech
PRO
0
130
ai_cording_with_k8s_knowledge.pdf
mochizuki875
1
310
継続的なAIコスト最適化
bgpat
1
200
AI時代に必要な脅威モデリング― 変化の速度に負けない理解とリスク判断
masakane55
5
1.1k
Incremental HTTP
kazuho
5
2.1k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Documentation Writing (for coders)
carmenintech
77
5.6k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
GitHub's CSS Performance
jonrohan
1033
470k
Evolving SEO for Evolving Search Engines
ryanjones
0
310
A Modern Web Designer's Workflow
chriscoyier
699
190k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
BBQ
matthewcrist
90
10k
Deep Space Network (abreviated)
tonyrice
0
360
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
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