Php 使用预加载时是否可以运行多个Symfony应用程序?
我在不同的子域上有两个单独的Symfony安装。Php 使用预加载时是否可以运行多个Symfony应用程序?,php,symfony,preload,php-7.4,Php,Symfony,Preload,Php 7.4,我在不同的子域上有两个单独的Symfony安装。 但是,当我尝试访问第二个域时,它会说: 致命错误:无法在/var/www/public\u test\u api/releases/20200909003532/vendor/String/Resources/functions.php:14第14行的/var/www/public\u test\u api/releases/20200909003532/vendor/Symfony/String/Resources/functions.php中
但是,当我尝试访问第二个域时,它会说: 致命错误:无法在/var/www/public\u test\u api/releases/20200909003532/vendor/String/Resources/functions.php:14第14行的/var/www/public\u test\u api/releases/20200909003532/vendor/Symfony/String/Resources/functions.php中重新声明Symfony\Component\String\String\u() 请注意,冲突发生在不同的目录之间,它们彼此之间没有任何关系 这是缓存问题吗?我如何解决这个问题?我试图在第二次安装时禁用OPCache,但没有任何改变。APCu也已启用 第三方软件也有同样的问题,它也使用Symfony 禁用
opcache.preload
设置似乎可以解决此问题
有没有办法在同一台服务器上运行所有这些应用程序并从预加载中获益?对于在同一台服务器中多次使用的类,不能使用预加载 预加载通过读取
opcache.preload
中指定的文件,将相关定义保留在内存中。如果您预加载一个Symfony实例,然后尝试加载另一个Symfony实例,则会出现定义冲突(正如您所经历的那样)
实际上,要从预加载中获益,您需要有独立的“专用”服务器,即使这些服务器不是物理机,而是虚拟机或容器
正如报告中所述:
[…]如果这些类是从一个应用程序的代码库中预加载的,那么这种方法将与托管多个应用程序或多个版本的应用程序的服务器不兼容,这些应用程序或应用程序的多个版本对于具有相同名称的某些类会有不同的实现,它将与从其他应用加载不同的类实现冲突
TLDR;不能在同一服务器上对同一类的多个实例使用预加载。您必须关闭预加载,或者将每个应用程序移动到其自己的专用容器中,使其不共享PHP-FPM进程