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
Akinori Takigawa
June 21, 2024
Technology
5k
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
100
PHPUnitのテストイベントを使ってテストにかかる時間の計測をしよう
akinoriakatsuka
0
180
パイプ演算子の実装を 覗いてみよう
akinoriakatsuka
0
260
PHPでCQRS+ES入門
akinoriakatsuka
0
240
手軽に作れる電卓を作って イベントソーシングに親しもう CQRS+ESカンファレンス2026
akinoriakatsuka
0
1.1k
Rubyで作る物理エンジン - 叡電LT
akinoriakatsuka
0
49
パイプ演算子の実装を覗いてみよう - 【非公式】PHPカンファレンス福岡2025・前日Meetup
akinoriakatsuka
0
53
技術的負債の会計学 - PHPカンファレンス広島2025
akinoriakatsuka
8
1.6k
スクラムをちゃんとやる勇気
akinoriakatsuka
0
76
Other Decks in Technology
See All in Technology
つくって納得、つかって実感! 大規模言語モデルことはじめ ver2.0
recruitengineers
PRO
4
1.6k
Model Studio CLI × Token Plan
maigo999
0
160
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
200
個人OSSが、机の上から世界に広がるまでの話
shinyasaita
1
390
モノリス Rails でも日中に rails db:migrate を走らせたい! / Daytime rails db:migrate on Monolithic Rails!
euglena1215
4
580
20分でわかるセキュアAPI
nwiizo
2
250
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
240
DatadogのBits Chatが開発組織にもたらしたもの / What Bits Chat Has Brought Us
sms_tech
1
240
Genie Codeハンズオン基礎編
taka_aki
1
110
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
320
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.3k
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
790
Ethics towards AI in product and experience design
skipperchong
2
340
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1.1k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
200
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The Invisible Side of Design
smashingmag
301
52k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Building Adaptive Systems
keathley
44
3.2k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
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