【问题标题】:Unload composer autoloader after Code was used使用 Code 后卸载 composer autoloader
【发布时间】:2016-10-06 09:26:26
【问题描述】:

所以我正在构建一个工具来提高网站的安全性。 该工具在 CMS 启动之前加载,并将扫描请求中的有问题的内容(如软防火墙)

问题是 - 我在 Composer 上使用了一些库来构建该工具。到目前为止,一切都很好。 现在我认为这可能是个坏主意,因为如果 CMS 也调用 Composer Autoload,我们可能会在代码中拥有相同库的不同版本(这会产生问题和错误)。

那么有没有办法在我的脚本完成扫描请求后卸载我的作曲家自动加载?

感谢您的帮助:)

【问题讨论】:

  • 我想知道为什么您没有将您的工具集成到 CMS 中,而是将其开发为一个单独的工具?
  • 使用单独的供应商目录,这样您就不会遇到路径冲突并使用$functions = spl_autoload_functions(); foreach($functions as $function) { spl_autoload_unregister($function); }
  • @Xatenev 我以后也想在其他网站上使用这个工具。所以它必须是不特定的 CMS。

标签: php composer-php


【解决方案1】:

是的,您可以按如下方式取消注册自动加载功能:

$functions = spl_autoload_functions();
foreach($functions as $function) {
    spl_autoload_unregister($function);
}

来源:http://php.net/manual/en/function.spl-autoload-unregister.php#112225

但是,这不会让您一无所获(这是您想要的):

  • 您必须取消设置任何全局变量
  • 某些库可能会定义常量,您无法取消设置和/或修改它们 (source)
  • 您在代码中加载的任何类都将在请求的生命周期内保持加载状态,据我所知,没有办法卸载它们 (source)

您最好的选择是将您的代码集成到所述应用程序中(即合并作曲家文件)并在维护应用程序时保持版本同步。

【讨论】:

  • 好的 - 我可以为此使用命名空间,这样我就不会与来自网站的其他调用发生冲突?
  • 对于您自己的代码,是的。但是,假设您通过 composer 安装的某个库加载了一个类 Foo\Bar。您取消注册自动加载,但 Foo\Bar 类定义仍然加载。当之后运行的 CMS 请求 Foo\Bar 时,将收到您的代码加载的内容。因此,建议合并您的作曲家文件并保持 lib 版本同步(请参阅我的编辑)。是的,这可能会导致依赖地狱,但只要您将作曲家库锁定到稳定版本/标签,它就应该是可管理的。
【解决方案2】:

composer 会在您的供应商文件夹中生成一个 autoload.php。并且每个 composer 调用都会覆盖 autoload.php。

您可以为自己的供应商使用单独的文件夹,这很好。

您还可以在 composer.json 中更改文件夹以与“installer-paths”一起使用。

【讨论】:

  • 谢谢我已经使用了不同的供应商目录。但我认为自动加载会转到我的目录而不是 cms 的供应商目录。
  • 好的,你如何启动你的软防火墙? - 我会推荐某种进程隔离。 (如 PhpProcess )
【解决方案3】:

好问题。 当我的代码中的 2 个地方使用不同版本的 guzzle 时,我遇到了类似的问题。 因此,您不能在运行时取消注册已注册的类。 你不能cleanruntime 从你的防火墙的足迹。 因此,您无法确定无论在何处使用您的产品都兼容且不冲突。 悲伤,但真实。

【讨论】:

  • 所以我对这个项目的解决方案是将作曲家合并在一起。对于其他一切,我需要编写自己的类才能使其工作。如果我只使用自己的解决方案,我不应该说作曲家有问题。这个ofc还有其他问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2012-06-21
相关资源
最近更新 更多