PHP类库的自动加载主要是由composer来实现的。
- 项目安装composer之后(
composer install
),项目根目录会增加一个vendor
目录,里面有一个autoload.php
文件,接下来在项目入口引入这个文件即可支持自动加载。
autoload介绍
Composer支持四种自动加载模式:PSR-4(推荐)、PSR-0、classmap、files
- 推荐使用PSR-4,此方式无需在每次新增类后手动修改composer.json配置
本文只讨论PSR-4的加载方式,如下所示psr-4定义了命名空间到项目目录(与vendor目录同级相对路径)的映射,命名空间Foo\\Bar\\Baz
对应的文件将从src/Bar/Baz.php
加载。
- 命名空间必须以
\\
结尾,避免相同前缀的冲突,Foo
和FooBar
是有区别的
#composer.json autoload配置
{
"autoload": {
"psr-4": {
"Foo\\": "src/"
}
}
}
- 修改完composer.json的
autoload
字段后,需手动更新自动加载:
composer dumpautoload -o
autoload优化
使用自动加载会增加一些开销,一些大型框架每个请求会有50~100ms的延时。
- 优化策略
不要在开发环境下使用这些优化策略
优化方式 | 等级 | 说明 |
---|---|---|
composer dump-autoload -o |
Level-1 | 将 PSR-4/PSR-0 的规则转化为了 classmap 的规则;当加载器找不到目标类是,会按照PSR-4/PSR-0去文件系统查找(速度慢) |
composer dump-autoload -a |
Level-2/A | 自动执行Level 1命令,生成classmap;但当找不到目标类时不会去文件系统查找 |
composer dump-autoload -apcu |
Level-2/B | 不会自动生成classmap,只是启用APCu缓存来存储文件系统中找到类的结果;生产环境中一般与Level-1结合使用:composer dump-autoload -o --apcu
|
参考:
https://getcomposer.org/doc/04-schema.md#autoload
https://getcomposer.org/doc/articles/autoloader-optimization.md
composer autoload 自动加载性能优化指南