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
240
パイプ演算子の実装を 覗いてみよう
akinoriakatsuka
0
340
PHPでCQRS+ES入門
akinoriakatsuka
0
250
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
1.2k
Rubyで作る物理エンジン - 叡電LT
akinoriakatsuka
0
59
パイプ演算子の実装を覗いてみよう - 【非公式】PHPカンファレンス福岡2025・前日Meetup
akinoriakatsuka
0
64
技術的負債の会計学 - PHPカンファレンス広島2025
akinoriakatsuka
8
1.7k
スクラムをちゃんとやる勇気
akinoriakatsuka
0
83
Other Decks in Technology
See All in Technology
WasmをRustにする
sansantech
PRO
0
250
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
380
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
120
1つのリクエストを追って理解する - llm-dのP/D分離
akhino
1
160
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
580
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
770
How to Design Configuration for Rails Applications
willnet
1
770
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
110
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
150
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
150
会社説明資料
persolserverworks
0
9.8k
Featured
See All Featured
Believing is Seeing
oripsolob
1
240
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
Documentation Writing (for coders)
carmenintech
77
5.6k
Building an army of robots
kneath
307
47k
Raft: Consensus for Rubyists
vanstee
142
7.8k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
Marketing to machines
jonoalderson
1
5.9k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
Docker and Python
trallard
47
4.2k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
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