什么是;“未知类型依赖项”;是指在预加载PHP脚本时?

什么是;“未知类型依赖项”;是指在预加载PHP脚本时?,php,preloading,php-7.4,Php,Preloading,Php 7.4,我正试图利用PHP7.4提供的新功能 我运行了composer install--no dev--optimize autoloader来生成项目中所有可用类的列表,并使用以下preload.php脚本来预加载它们: $files=require'vendor/composer/autoload_classmap.php'; foreach(数组_唯一($files)作为$file){ opcache_编译_文件($file); } 并在我的opcache.ini文件中配置了此预加载脚本: o

我正试图利用PHP7.4提供的新功能

我运行了
composer install--no dev--optimize autoloader
来生成项目中所有可用类的列表,并使用以下
preload.php
脚本来预加载它们:

$files=require'vendor/composer/autoload_classmap.php';
foreach(数组_唯一($files)作为$file){
opcache_编译_文件($file);
}
并在我的
opcache.ini
文件中配置了此预加载脚本:

opcache.preload=/path/to/preload.php
然后重新启动
php fpm
。现在
systemctl status php fpm.service
报告以下警告:

PHP警告:无法预加载未链接的类Brick\Money\Context\CashContext:中的未知类型依赖项。。。第16行
PHP警告:无法预加载未链接的类Brick\Money\Context\AutoContext:中的未知类型依赖项。。。第17行
PHP警告:无法预加载未链接的类Brick\Math\BigRational:中未知的类型依赖项。。。第17行
PHP警告:无法预加载未链接的类Brick\Math\BigInteger:中的未知类型依赖项。。。在线20
PHP警告:无法预加载未链接的类Brick\Math\BigDecimal:中的未知类型依赖项。。。第15行

什么是“未知类型依赖项”?如何预加载这些类


注意:我是有问题库的维护者,所以如果这些库需要修改以使其可预加载,我洗耳恭听

这意味着PHP在运行时无法在预加载的文件中找到类:

预加载:放宽已知类型限制
检查是否存在同名的父/接口/特征方法,然后才要求知道类型。这减少了在实践中大量触发的情况

预加载的文件不使用Composer autoloader,因此不预加载的类将不存在

Symfony修复了此问题,它可以加载其依赖项。这是为了预加载
加载接口
注释类loder

<?php 
// preload.php
$classes[] = 'Symfony\Component\Config\Loader\LoaderInterface';
$classes[] = 'Symfony\Component\Routing\Loader\AnnotationClassLoader';

Preloader::preload($classes);

RFC提到了这一点:只有没有未解析的父类、接口、特征和常量值的类才可以预加载。这意味着在错误消息中提到的类型(类、接口、特征)之前,您必须预加载包含这些类型(类、接口、特征)的文件。它是什么操作系统@Kubo2我不确定它们是否必须在之前预加载:那么循环依赖关系呢?我希望他们能以任何顺序工作,但我可能错了。不管怎么说,我还收到了其他与预加载脚本中未包含的类相关的警告,但这些警告是不同的,当一个类试图扩展未预加载的类时,它们说“未知父级”。这是“未知类型依赖项”,我正试图找出这是什么意思。@revo它是CentOS 7.7,这有什么区别吗?@NikiC我不知怎的希望PHP文件在预加载脚本执行期间编译成操作码,并在脚本结束后完成链接,所有必要的等级均已预加载;这将防止任何依赖性问题。不是这样吗?顺序重要吗?谢谢你的回答。不过,我还是不知道这些令人讨厌的课程到底出了什么问题。例如,它只是一个在同一个包中实现接口的类。@Benjamin错误可能会更好,但我认为问题出在
BigNumber
。PHP仍然不能很好地处理预加载文件中的协方差和逆变。那么您的意思是,任何在其方法中接受或返回
BigNumber
的类都可能无法预加载?@Benjamin Yes。有些时候,PHP可以通过比较完整的类名字符串来找出答案,但在这里它没有这样做。这可能是因为
BigNumber
abstract
或者其他地方存在另一个重载。预加载仍然是新的,所以应该会更好。@Rain是的,当您使用
require
时,预加载可能会导致严重错误。但这应该意味着有一个实际的错误。尼基奇帮了很多忙,所以他知道自己在说什么。