首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在预装PHP脚本时,“未知类型依赖”意味着什么?

在预装PHP脚本时,“未知类型依赖”意味着什么?
EN

Stack Overflow用户
提问于 2019-12-29 15:01:24
回答 1查看 408关注 0票数 3

我正在尝试使用PHP7.4之后可用的新预压特征

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

代码语言:javascript
复制
$files = require 'vendor/composer/autoload_classmap.php';

foreach (array_unique($files) as $file) {
    opcache_compile_file($file);
}

并在我的opcache.ini文件中配置了这个预加载脚本:

代码语言:javascript
复制
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行

“未知类型依赖”意味着?如何预装这些类?

注意:我是那些冒犯的库https://github.com/brick/mathhttps://github.com/brick/money的维护者,所以如果这些库需要修改以使它们可预装,我将全神贯注!

EN

回答 1

Stack Overflow用户

发布于 2019-12-29 15:35:22

这意味着PHP在运行时无法在预加载的文件中找到类。只有当可能存在不兼容的方法时,才会发生这种情况。

预压:放松已知类型限制 检查是否存在具有相同名称的父/接口/特性方法,并且只需要知道类型。这大大减少了实际触发的情况。

预加载的文件不使用Composer自动加载程序,所以没有预加载的类就不存在了。

Symfony通过班级修复了这个问题,它可以加载它的依赖项。这是如何使用它预加载LoaderInterfaceAnnotationClassLoder

代码语言:javascript
复制
<?php 
// preload.php
$classes[] = 'Symfony\Component\Config\Loader\LoaderInterface';
$classes[] = 'Symfony\Component\Routing\Loader\AnnotationClassLoader';

Preloader::preload($classes);

在找到更好的方法之前,您可以复制该类或预加载库所依赖的所有类。

如果可以允许预压失败是硬错误,请使用来自NikiC的回答

为了避免依赖问题,可以使用require而不是opcache_compile_file()预加载。这将很好地处理循环依赖关系,但如果预压失败(而不仅仅是警告),则会出现严重错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59520529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档