【问题标题】:Composer optimization level 1Composer 优化级别 1
【发布时间】:2018-10-06 16:48:45
【问题描述】:
在作曲家的autoload optimization page:
注意:您不应在开发中启用任何这些优化,因为它们都会在添加/删除类时导致各种问题。在开发环境中,性能提升不值得麻烦。
我绝对可以在开发环境中看到 2 级优化(权威类映射)的问题,但如果我遵循 PSR-4 标准,我无法确定 level 1 optimizations(类映射生成)的问题是什么.
- 如果我添加了一个未在类映射中生成的类,它将回退到 PSR-4 规则来查找该类。
- 如果我将一个类重构(移动)到不同的命名空间,它也不会在类映射中找到它并尝试使用 PSR-4 规则解决它。
对于符合 PSR-4 的项目,在开发环境中生成的类映射有哪些潜在问题?
【问题讨论】:
标签:
php
composer-php
autoload
psr-4
【解决方案1】:
如果您将类移动到不同的目录而不更改命名空间,则 1 级优化可能会产生问题。由于可能有多种方法可以解析单个命名空间,因此 Composer 将正确处理此类更改,但当您拥有过时的类映射时可能会失败。
例子:
"autoload": {
"psr-4": {
"app\\": "src",
"app\\db\\": "src/drafts/db"
}
},
app\db\Entity 类可以放在src/drafts/db/Entity.php 或src/db/Entity.php 中,并且 Composer 将按此顺序搜索类文件。通常,如果您将文件从src/drafts/db 移动到src/db,Composer 最终会找到这个类。但是如果你有过时的classmap,Composer会盲目地包含不存在的文件,你会得到一个致命的错误。
除了这个apcu-autoloader 选项还会缓存未命中。所以如果你请求一个不存在的app/db/NewEntity 类,然后添加这个类,Composer 将不会检测到这个变化,因为它已经缓存了这个类不存在的信息。
这些通常是边缘情况,通常您永远不会注意到这些细微差别。但这仍然是可能的,并且在开发环境中不明显的性能提升不值得冒几个小时来调试 Composer 自动加载器的缓存相关问题的风险。