2016-10-06 92 views
2

所以我正在构建一个工具来增加网站的安全性。 该工具在CMS启动之前加载并将扫描有问题内容的请求(如软防火墙)使用代码后卸载作曲家自动加载器

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

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

谢谢你的任何帮助:)

+1

我想知道为什么你没有将你的工具集成到CMS中,而是将它作为一个单独的工具进行开发? – Xatenev

+0

使用单独的供应商目录,以免碰到路径冲突并使用'$ functions = spl_autoload_functions(); foreach($ function as $ function){ spl_autoload_unregister($ function); }' – Xatenev

+0

@Xatenev我想在未来的其他网站上使用这个工具。所以它必须是CMS不特定的。 – OmegaTCU

回答

0

是的,你可以注销自动加载功能如下:

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

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

但是,这不会离开你一个干净的石板(这是你想要的):

  • 你将不得不取消任何全局变量
  • 某些库可能会定义常量,并且没有办法fo (source
  • 您在代码中加载的任何类都将在请求的生命周期内保持加载状态,并且据我所知,无法卸载它们(source

最好的办法是把你的代码集成到上述应用程序中(即合并作曲文件)并在维护应用程序时保持版本同步。

+0

好吧 - 我可以使用这个命名空间,这样我就不会与来自网站的其他调用发生冲突吗? – OmegaTCU

+0

对于你自己的代码,是的。然而,让我们说通过作曲者安装的一些库加载了一个Foo \ Bar类。您取消注册自动加载,但“Foo \ Bar”类定义保持加载状态。当后来运行的CMS询问'Foo \ Bar'时,将会收到您的代码加载的内容。因此,建议合并您的作曲家文件并保持lib版本的同步(请参阅我的编辑)。是的,这可能导致依赖地狱,但只要你的作曲家库保持锁定到稳定的版本/标签,它应该是可管理的。 – MicE

0

以及作曲家生成您的供应商文件夹中的autoload.php。每个作曲家调用都会覆盖autoload.php。

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

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

+0

谢谢我已经使用不同的供应商目录。但我认为自动加载然后会转到我的目录而不是cms的供应商目录。 – OmegaTCU

+0

好的,你如何开始你的软防火墙? - 我会推荐某种进程隔离。 (如PhpProcess) – Gladhon

0

不错的问题。 当我的代码中的两个地方使用不同版本的guzzle时,我遇到了类似的问题。 因此,您无法在运行时取消注册已注册的类。 从firerwall的脚步中你不能运行clean。 因此,无论使用何种产品,您都无法确定您的产品是否兼容且无冲突。 悲伤,但是确实如此。

+0

所以我对这个项目的解决方案是将作曲家合并在一起。对于其他所有我需要编写我自己的类来使其工作。如果我只使用自己的解决方案,我不应该说与作曲家的问题。这ofc带有其他问题... – OmegaTCU

相关问题